मैं यहां. मेरे पास निम्नलिखित स्निपेट हैं।

>>> Entry.objects.first().pub_date
datetime.date(2021, 8, 18)
>>> Entry.objects.first().mod_date
datetime.date(2021, 8, 18)

लेकिन अगर मैं निम्नलिखित कोशिश करता हूं तो मुझे एक खाली क्वेरीसेट मिलता है।

Entry.objects.filter(pub_date__year=F('mod_date__year'))

यह काम क्यों नहीं कर रहा है। क्या यह एक बग है?

1
chaulap 22 अगस्त 2021, 16:34
1
क्या आप अपने फ़िल्टर के बाद Entry.objects.values() के लिए लॉग जोड़ सकते हैं? मैं सोच रहा था कि डेटाबेस को आपके आदेशों के बीच संशोधित किया गया था। हो सकता है कि first() 2 अलग-अलग वस्तुओं को संदर्भित करता हो, या हो सकता है कि यह सिर्फ एक ही वस्तु हो लेकिन pub_date और/या mod_date को पृष्ठभूमि में बदल दिया गया हो।
 – 
Niel Godfrey Ponciano
22 अगस्त 2021, 17:21
आप किस डीबी का उपयोग कर रहे हैं?
 – 
Brian Destura
23 अगस्त 2021, 04:56
मैं स्क्लाइट का उपयोग कर रहा हूं।
 – 
chaulap
23 अगस्त 2021, 15:31

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि django __year हैंडल करता है और अन्य __ तारीख का एक्सट्रैक्शन एनोटेट या एफ एक्सप्रेशन के साथ अलग-अलग होता है, जब आप इसे किसी फ़िल्टर में इस्तेमाल करते हैं।

उदाहरण के लिए पोस्टग्रेज में, filter(pub_date__year=F('mod_date__year')) के साथ उत्पन्न क्वेरी है:

WHERE EXTRACT(\'year\' FROM pub_date") = ("mod_date")

जिसके परिणामस्वरूप त्रुटि होगी। लेकिन अगर एक पूर्णांक वर्ष के साथ प्रयोग किया जाता है जैसे filter(pub_date__year=2021):

WHERE "pub_date" BETWEEN 2021-01-01 AND 2021-12-31'

अर्क का उपयोग करना:

इसे हल करने के लिए, Extract< का उपयोग करने का प्रयास करें /a> सही फ़िल्टर उत्पन्न करने के लिए:

from django.db.models.functions import Extract


Entry.objects.filter(pub_date__year=Extract('mod_date', 'year'))

जो इस क्वेरी को उत्पन्न करेगा:

WHERE EXTRACT(\'year\' FROM "pub_date") = (EXTRACT(\'year\' FROM "mod_date"))'
1
Brian Destura 23 अगस्त 2021, 04:57