Django: استعلامات SQL Datediff؟
سؤال
أحاول القيام بما يعادل SQL التالي في Django:
حدد * من مقدم الطلب حيث date_out - date_in> = 1 و date_out - date_in <= 6
يمكنني القيام بذلك كاستعلام SQL الخام ، لكن هذا أصبح محبطًا في التعامل مع Rawqueryset بدلاً من كائن QuerySet العادي كما أود أن أكون قادرًا على تصفيةه لاحقًا في الكود.
المحلول
يمكنك استخدام ال extra()
الطريقة والمرور في أ where
حجة الكلمة الرئيسية. قيمة ال where
يجب أن تكون قائمة تحتوي على SQL WHERE
بند الاستعلام أعلاه. لقد اختبرت ذلك باستخدام PostgreSQL 8.4 وهذا ما بدا عليه في حالتي:
q = Applicant.objects.extra(where = ["""date_part('day', age(date_out, date_in)) >= 1 and
date_part('day', age(date_out, date_in)) <= 6"""])
هذا سيعيد لك ساري المفعول QuerySet
نموذج.
نصائح أخرى
صادفت قضية Django لا تدعم أصلاً Datediff
(وغيرها من معادل قاعدة البيانات) ، وتحتاج إلى استخدام هذه الوظيفة عدة مرات لمشروع معين.
عند مزيد من القراءة ، أصبح من الواضح أن تنفيذ حساب الفاصل الزمني من تاريخين يختلف على نطاق واسع بين نكهات قاعدة البيانات الرئيسية. ربما هذا هو السبب في أنها لم تحصل على وظيفة تجريد أصلية في Django حتى الآن. لذلك كتبت وظيفة django orm الخاصة بي datediff
:
نرى: Mike-DB-Tools مستودع جيثب
سترى بناء الجملة المتغير بين خلفية قاعدة البيانات المكتوبة في docstrings لقواعد البيانات المعنية. يدعم Datediff SQLITE و MYSQL / MARIADB و POSTGRESQL و ORACLE.
الاستخدام (Django 1.8+):
from db_tools import Datediff
# Define a new dynamic fields to contain the calculated date difference
applicants = Applicant.objects.annotate(
days_range=Datediff('date_out','date_in', interval='days'),
)
# Now you can use this dynamic field in your standard filter query
applicants = applicants.filter(days_range__gte=1, days_range__lte=6)
أنا حقًا derpy تمامًا عندما يتعلق الأمر بالرمز الخاص بي ، لذلك أشجعك على الشوكة والتحسن.