2012-09-12 1 views
46

Der Versuch, eine Abfrage zu erhalten, bei der der Aktivitätsdatensatz in meinem Solr-Index veraltet ist. Ich möchte überprüfen, ob das Activity.updated Datum in der Datenbank größer ist als die Activity.added_toSolr_date für den gleichen Datensatz.So erstellen Sie einen Django-Queryset-Filter, der zwei Datumsfelder im selben Modell vergleicht

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

Modell

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

I verwiesen docs Django Abfrage: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ und Unit-Tests für die Proben: https://github.com/django/django/blob/master/tests/modeltests/or_lookups/tests.py

auch hier auf Stackoverflow gesucht. Alle Beispiele verwenden ein eingegebenes Datum, anstatt zwei Datumsfelder im selben Modell zu vergleichen.

Antwort

107

F objects.

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

Vielen Dank! Wie hast du das entdeckt? –

+3

@CarlosFerreira, durch jahrelange Verwendung von Django jeden Tag. Ich kann nicht wirklich sagen wann. –

+0

nette Lösung! fast die gleiche Frage geschrieben – Ron

1

Die Lösung von Yuji Tomita leider funktionierte nicht.

ein Modell unten vor:

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

Vorlage:

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

Am Ende habe ich eine leere Liste, aber ich weiß, es ist nicht richtig. Ich habe auch die folgenden in der Vorlage (ohne queryset Filter):

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

Es funktionierte, aber ich würde es vorziehen, eine elegantere Lösung zu sehen.

+0

Bei einem schnellen Lesevorgang sieht es so aus, als würden Sie zwei verschiedene Dinge in Ihrem Filter für Suchanfragen und in unserem Vorlagencode tun. In ersterer verwenden Sie 'gte' und in letzterer verwenden Sie '=='.Ist dies der Grund, warum die beiden nicht die gleichen Ergebnisse liefern? Ich versuche herauszufinden, warum 'mydate__exact = F ('my_other_date')' in einer Abfrage nicht funktioniert, wenn 'my_other_date' None ist, ich selbst. – jenniwren

Verwandte Themen