اذهب إلى المحتوى
  • 1

كيف أقوم بتصفية عناصر الاستعلام حسب نطاق التاريخ في جانغو Django؟

Amer Abdallah

السؤال

لدي حقل في نموذج واحد، كالتالي:

class Video(models.Model):
    date = fields.DateField(auto_now=False)

الآن، أحتاج إلى تصفية الكائنات حسب النطاق الزمني. كيف أقوم بتصفية جميع الكائنات التي لها تاريخ بين 1 أغسطس 2021 و 31 أغسطس 2021؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكنك أن تستخدم المدخل date__range، كالتالي:

Video.objects.filter(date__range=["2021-08-01", "2021-08-31"])

لاحظ أن الحل السابق يقوم بتنفيذ جملة BETWEEN في SQL، مما يعني أن النطاق يتضمن يومي 1/8 و 31/8 أيضًا.

إذا كنت لا تريد تضمين هذين اليومين مع النتائج، فيمكنك أن تستخدم خاصية gt (greater-than) و lt (less-than)، كالتالي:

import datetime
videos = Video.objects.filter(video_date__gte=datetime.date(2021, 8, 1), video_date__lte=datetime.date(2021, 8, 31))

أو إذا كنت تحاول فقط التصفية حسب الشهر:

Video.objects.filter(date__year='2021', date__month='08')

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

عند إجراء django ranges باستخدام filter ، تأكد من معرفة الفرق بين استخدام كائن date و كائن datetime
 __range شامل للتواريخ ولكن إذا كنت تستخدم كائن datetime لتاريخ الانتهاء ، فلن يتضمن إدخالات ذلك اليوم إذا لم يتم تعيين الوقت.

from datetime import date, timedelta

startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])

سوف يقوم الكود بإرجاع كافة الإدخالات من تاريخ البدء إلى تاريخ الانتهاء بما في ذلك تلك التواريخ المدخلة

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك القيام بذلك بالشكل التالي:

start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)
ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])

أو لمرونة أكبر يمكنك تصميم FilterBackend كالتالي:

class FilterBackend(generic_filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        #POST ل request.data أو
        predicate = request.query_params
        if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is not None:
            queryset = queryset.filter(your_date__range=(predicate['from_date'], predicate['to_date']))
        if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is None:
            queryset = queryset.filter(your_date__gte=predicate['from_date'])
        if predicate.get('to_date', None) is not None and predicate.get('from_date', None) is None:
            queryset = queryset.filter(your_date__lte=predicate['to_date'])
        return queryset

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...