93 votes

Comment créer un filtre Django queryset comparant deux champs de date dans le même modèle ?

J'essaie d'obtenir une requête où l'enregistrement de l'activité est périmé dans mon index Solr. Je veux vérifier si le Activity.updated dans la base de données est supérieure à la date 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")

Je me suis référé à la documentation de Django Query : 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 saisie au lieu de comparer deux champs de date dans le même modèle.

183voto

Yuji 'Tomita' Tomita Points 46106

Objets F.

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

3voto

Sergey Krivoy Points 39

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

Considérons 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 %}

Au final, j'obtiens une liste vide, mais je sais que ce n'est pas correct. J'ai également utilisé ce qui suit dans le modèle (sans filtre queryset) :

{% 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X