एक ही मॉडल में दो दिनांक फ़ील्ड की तुलना करके Django क्वेरीसेट फ़िल्टर कैसे बनाएं


82

मेरे सोलर इंडेक्स में गतिविधि रिकॉर्ड बासी होने पर एक क्वेरी प्राप्त करने की कोशिश की जा रही है। मैं यह देखना चाहता हूं कि क्या Activity.updatedडेटाबेस में तारीख Activity.added_toSolr_dateसमान रिकॉर्ड के लिए अधिक है या नहीं ।

stale_activities_queryset = Activity.objects.filter(updated__gte = self.added_toSolr_date) 

नमूना

class Activity(models.Model):
    # Last time entry / metric was updated in the Activity model database
    updated =  models.DateTimeField( verbose_name="CRUD date")
    # When it was added to Solr Index Date
    added_toSolr_date = models.DateTimeField(blank=True, null=True, verbose_name="Added to Solr Index Date")

मैंने Django क्वेरी डॉक का संदर्भ दिया: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ और नमूनों के लिए यूनिट परीक्षण: https://github.com/django/django/bjb/master/tests/ modeltests / or_lookups / test.py

यहां पर स्टाॅकओवरफ्लो पर भी सर्च किया गया। सभी उदाहरण एक ही मॉडल में दो दिनांक फ़ील्ड की तुलना करने के बजाय एक प्रविष्ट दिनांक का उपयोग करते हैं।

जवाबों:


162

एफ ऑब्जेक्ट्स।

from django.db.models import F
stale_activities = Activity.objects.filter(updated__gte=F('added_toSolr_date')) 

बहुत बहुत धन्यवाद! आपको यह कैसे पता चला?
कार्लोस फ़ेरेरा

6
@CarlosFerreira, हर दिन django का उपयोग करने के वर्षों के माध्यम से। मैं वास्तव में कब नहीं कह सकता।
युजी 'तोमिता' टॉमिटा सेप

अच्छा समाधान! लगभग एक ही सवाल पोस्ट किया
रॉन

धन्यवाद! मुझे इसकी तलाश थी!
एलेक्स सैंटोस

2
यह विफल रहता है अगर किसी एक दिनांक को पूर्ण हो। अशक्त या तुलना करने और फिर भी विफल होने के लिए क्यू का उपयोग करना। हालांकि यह MySQL में नहीं होगा, किसी और को यह देखकर?
पॉल केनजोरा

3

दुर्भाग्य से, युजी टमिता का समाधान काम नहीं आया।

नीचे एक मॉडल पर विचार करें:

class list(models.Model):
    text = models.CharField(max_length=140)
    created = models.DateTimeField()
    modified = models.DateTimeField()

क्वेरी:

my_list = todolist.objects.order_by('created').filter(created__gte=F('modified'))

साँचा:

{% if my_list %}
{% for list in my_list %}
{{ list.text}}
{% endfor %}
{% else %}
<p>there is no list</p>
{% endif %}

अंत में मुझे एक खाली सूची मिलती है, लेकिन मुझे पता है, यह सही नहीं है। मैंने टेम्पलेट के अंदर निम्नलिखित का भी उपयोग किया है (बिना क्वेरी फ़िल्टर के)

{% if list.created|date:'d m y h:i:s' == list.modified|date:'d m y h:i:s' %}

इसने काम किया, लेकिन मैं अधिक सुरुचिपूर्ण समाधान देखना पसंद करूंगा।


त्वरित पढ़ने पर ऐसा लगता है कि आप अपने क्वेरी फ़िल्टर में दो अलग-अलग चीज़ें कर रहे हैं और हमारे टेम्प्लेट कोड को y करें। पूर्व में आप 'gte' का उपयोग कर रहे हैं और बाद में आप '==' का उपयोग कर रहे हैं। क्या यही कारण है कि दोनों एक ही परिणाम नहीं देते हैं? मैं यह जानने की कोशिश कर रहा हूं कि mydate__exact = F('my_other_date')जब 'my_other_date' कोई भी हो, तो किसी क्वेरी का उपयोग करने से काम नहीं चलता है।
जेनिवरेन

मेरे पास एक और कारण था कि यह काम क्यों नहीं करेगा। का उपयोग कर django-extensions TimeStampedModel, createdऔर updatedटाइमस्टैम्प नीचे milisecond के बराबर। न्यूनतम विलंब हुआ है। मेरी जल्दी ठीक करने के लिए यह सिर्फ दूसरे से तुलना करने के लिए किया गया था।
tschale
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.