سؤال

أحاول القيام بما يعادل 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 تمامًا عندما يتعلق الأمر بالرمز الخاص بي ، لذلك أشجعك على الشوكة والتحسن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top