سؤال

ماذا سيكون مكافئ محرك التطبيق لبيان django هذا؟

return Post.objects.get(created_at__year=bits[0], 
                            created_at__month=bits[1], 
                            created_at__day=bits[2],
                            slug__iexact=bits[3])

لقد انتهى الأمر بكتابة هذا:

Post.gql('WHERE created_at > DATE(:1, :2, :3) AND created_at < DATE(:1, :2, :4) and slug = :5',
    int(bit[0]), int(bit[1]), int(bit[2]), int(bit[2]) + 1, bit[3])

لكنها مروعة جدا مقارنة مع django. أي طريقة أخرى أكثر ثبات / جانغو السحرية، على سبيل المثال مع Post.filter() أو created_at.day/month/year صفات؟

هل كانت مفيدة؟

المحلول

لا تحتاج "relativeltelta" - ما تصفه هو Datetime.timedelta. خلاف ذلك، فإن إجابتك تبدو جيدة.

بقدر ما يذهب وقت المعالجة، فإن الشيء الجميل حول محرك التطبيق هو أن جميع الاستعلامات تقريبا لها نفس التكلفة لكل نتيجة - وجميعها مقياس متناسب مع السجلات التي تم إرجاعها، وليس حجم بيانات البيانات الإجمالي. على هذا النحو، فإن الحل الخاص بك يعمل بشكل جيد.

بالتناوب، إذا كنت بحاجة إلى مرشح عدم المساواة الخاص بك لشيء آخر، يمكنك إضافة dateProperty "created_day"، والقيام بمساواة بسيطة على ذلك.

نصائح أخرى

ماذا عن

from datetime import datetime, timedelta

created_start = datetime(year, month, day)
created_end = created_start + timedelta(days=1)
slug_value = 'my-slug-value'

posts = Post.all()
posts.filter('created_at >=', created_start)
posts.filter('created_at <', created_end)
posts.filter('slug =', slug_value)

# You can iterate over this query set just like a list
for post in posts:
    print post.key()

انتهى الأمر باستخدام relativedelta مكتبة + تسلسل المرشحات في نمط مسج، والتي على الرغم من أنها ليست بيثونية للغاية حتى الآن، هي صبي أكثر راحة لكتابة ومجفف كبير. :) لا تزال غير متأكد إذا كانت أفضل طريقة للقيام بذلك، كما ستحتاج إلى مزيد من وقت معالجة قاعدة البيانات؟

date = datetime(int(year), int(month), int(day))
... # then
queryset = Post.objects_published()
                            .filter('created_at >=', date)
                            .filter('created_at <', date + relativedelta(days=+1))
                            ...

وإزارة سبيكة إلى object_detail عرض أو مرشح آخر.

بالمناسبة يمكنك استخدام DateTime.timedelta. التي تتيح لك العثور على نطاقات التاريخ أو date deltas.

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