2012-09-12 9 views
46

Intentando obtener una consulta donde el registro de actividad está obsoleto en mi índice Solr. Quiero verificar si la fecha Activity.updated en la base de datos es mayor que Activity.added_toSolr_date para el mismo registro.Cómo crear un filtro de conjunto de consultas Django comparando dos campos de fecha en el mismo modelo

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

Modelo

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

que hace referencia docs Django consulta: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ y la unidad de pruebas para muestras: https://github.com/django/django/blob/master/tests/modeltests/or_lookups/tests.py

también se interesaron aquí en Stackoverflow. Todos los ejemplos usan una fecha ingresada en lugar de comparar dos campos de fecha en el mismo modelo.

Respuesta

107

F objects.

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

¡Muchas gracias! ¿Cómo descubriste esto? –

+3

@CarlosFerreira, a través de años de uso de django todos los días. Realmente no puedo decir cuándo. –

+0

buena solución! casi publicó la misma pregunta – Ron

1

La solución de Yuji Tomita, por desgracia, no funcionó.

Considere un modelo a continuación:

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

Plantilla:

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

Al final consigo una lista vacía, pero sé, no es correcto. También he utilizado la siguiente dentro de la plantilla (sin filtro queryset):

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

Funcionó, pero yo preferiría ver una solución más elegante.

+0

En una lectura rápida, parece que está haciendo dos cosas diferentes en el filtro de su conjunto de consultas y es el código de nuestra plantilla. En el primero estás usando 'gte' y en el último estás usando '=='.¿Es por eso que los dos no producen los mismos resultados? Estoy intentando averiguar por qué el uso de 'mydate__exact = F ('my_other_date')' en una consulta no funciona cuando 'my_other_date' es Ninguno, yo mismo. – jenniwren

Cuestiones relacionadas