web-dev-qa-db-fra.com

Comment créer un Django filtre d'ensemble de requêtes comparant deux champs de date dans le même modèle

Essayer d'obtenir une requête où l'enregistrement d'activité est périmé dans mon index Solr. Je veux vérifier si le Activity.updated la date dans la base de données est supérieure à la Activity.added_toSolr_date pour le même enregistrement.

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

Modèle

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

J'ai référencé Django Documents de requête: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ Et des tests unitaires pour les échantillons: - https://github.com/Django/django/blob/master/tests/modeltests/or_lookups/tests.py

Également recherché ici sur Stackoverflow. Tous les exemples utilisent une date entrée au lieu de comparer deux champs de date dans le même modèle.

63
Carlos Ferreira

objets F.

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

La solution de Yuji Tomita, malheureusement, n'a pas fonctionné.

Considérez un modèle ci-dessous:

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

Modèle:

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

En fin de compte, je reçois une liste vide, mais je sais, ce n'est pas correct. J'ai également utilisé les éléments suivants à l'intérieur du modèle (sans filtre d'ensemble de requêtes):

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

Cela a fonctionné, mais je préférerais voir une solution plus élégante.

2
Sergey Krivoy