2012-09-12 15 views
46

Cercando di ottenere una query in cui il record dell'attività è scaduto nel mio indice Solr. Voglio verificare se la data Activity.updated nel database è maggiore dello Activity.added_toSolr_date per lo stesso record.Come creare un filtro queryset Django confrontando due campi data nello stesso modello

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

Modello

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") 

ho fatto riferimento docs Django query: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ e l'unità di test per i campioni: https://github.com/django/django/blob/master/tests/modeltests/or_lookups/tests.py

cercato anche qui in StackOverflow. Tutti gli esempi utilizzano una data inserita invece di confrontare due campi data nello stesso modello.

risposta

107

F objects.

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

Grazie mille! Come l'hai scoperto? –

+3

@CarlosFerreira, attraverso anni di utilizzo di Django ogni giorno. Non posso davvero dire quando. –

+0

bella soluzione! ha pubblicato quasi la stessa domanda – Ron

1

La soluzione di Yuji Tomita, purtroppo, non ha funzionato.

Si consideri un modello di seguito:

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

Queryset:

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

Template:

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

Alla fine ottengo una lista vuota, ma lo so, non è corretta. Ho anche utilizzato il seguente all'interno del template (senza filtro set di query):

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

Ha funzionato, ma io preferirei vedere una soluzione più elegante.

+0

In una lettura veloce sembra che tu stia facendo due cose diverse nel tuo filtro di query e il nostro codice di modello. Nel primo caso stai usando 'gte' e nel secondo stai usando '=='.È per questo che i due non producono gli stessi risultati? Sto cercando di capire perché l'uso di 'mydate__exact = F ('my_other_date')' in una query non funziona quando 'my_other_date' è None, me stesso. – jenniwren

Problemi correlati