2012-09-12 6 views
46

Próbuję uzyskać zapytanie, w którym rekord aktywności jest nieaktualny w indeksie Solr. Chcę sprawdzić, czy data Activity.updated w bazie danych jest większa niż Activity.added_toSolr_date dla tego samego rekordu.Jak utworzyć filtr zapytań Django, porównując dwa pola dat w tym samym modelu?

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

model

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

ja odwoływać dokumenty Django zapytanie: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ i jednostkę testy dla próbek: https://github.com/django/django/blob/master/tests/modeltests/or_lookups/tests.py

szukali także tutaj na Stackoverflow. Wszystkie przykłady używają wprowadzonej daty zamiast porównywania dwóch pól dat w tym samym modelu.

Odpowiedz

107

F objects.

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

Dziękuję bardzo! Jak to odkryłeś? –

+3

@CarlosFerreira, przez lata używania django każdego dnia. Naprawdę nie mogę powiedzieć kiedy. –

+0

fajne rozwiązanie! prawie opublikował to samo pytanie – Ron

1

Rozwiązanie Yuji Tomita, niestety, nie działa.

Rozważmy poniższy wzór:

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

Szablon:

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

W końcu dostaję pustą listę, ale wiem, że nie jest poprawny. Mam również stosowane następujące wewnątrz szablonu (bez filtra queryset):

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

Udało się, ale wolałbym zobaczyć bardziej eleganckie rozwiązanie.

+0

W szybkim czytaniu wygląda na to, że robisz dwie różne rzeczy w filtrze querysef oraz y nasz kod szablonu. W pierwszym używasz 'gte', a w drugim używasz '=='.Czy to dlatego te dwie nie dają takich samych rezultatów? Próbuję dowiedzieć się, dlaczego użycie 'mydate__exact = F (" my_other_date ') 'w kwerendzie nie działa, gdy" my_other_date "jest None, ja. – jenniwren