J'ai un champ dans un modèle comme:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Maintenant, je dois filtrer les objets par plage de dates.
Comment filtrer tous les objets dont la date est comprise entre 1-Jan-2011
et 31-Jan-2011
?
python
django
django-models
django-queryset
user469652
la source
la source
__range
inclut les bordures (comme sqlBETWEEN
), si vous ne voulez pas que les bordures soient incluses, vous devrez aller avec ma solution gt / lt ...order_by
plus que le généréQuerySet
par ce qui précèdefilter
. Je n'ai pas utilisé Django depuis des années.Vous pouvez utiliser les django
filter
avec desdatetime.date
objets :la source
Lorsque vous effectuez des plages de django avec un filtre, assurez-vous de connaître la différence entre l'utilisation d'un objet date et d'un objet datetime. __range est inclusif sur les dates mais si vous utilisez un objet datetime pour la date de fin, il n'inclura pas les entrées pour ce jour si l'heure n'est pas définie.
renvoie toutes les entrées de la date de début à la date de fin, y compris les entrées à ces dates. Mauvais exemple, car cela renvoie des entrées une semaine dans le futur, mais vous obtenez la dérive.
il manquera 24 heures de saisie selon l'heure à laquelle les champs de date sont définis.
la source
date
objet:>>> from datetime import date
>>> startdate = date.today()
Vous pouvez contourner le «décalage d'impédance» causé par le manque de précision dans la
DateTimeField/date
comparaison d'objets - qui peut se produire si vous utilisez la plage - en utilisant un datetime.timedelta pour ajouter un jour à la dernière date de la plage. Cela fonctionne comme:Comme discuté précédemment, sans faire quelque chose comme ça, les enregistrements sont ignorés le dernier jour.
Modifié pour éviter l'utilisation de
datetime.combine
- semble plus logique de s'en tenir aux instances de date lors de la comparaison avec unDateTimeField
, au lieu de jouer avec desdatetime
objets jetables (et déroutants) . Voir plus d'explications dans les commentaires ci-dessous.la source
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
pas les objets créés surdate(2014, 2, 1)
, comme @cademan l'a expliqué utilement. Mais si vous augmentez la date de fin en ajoutant un jour, vous obtiendrez un ensemble de requêtes couvrant ces objets manquants (et en omettant facilement les objets créés àdate(2014, 2, 2)
cause de la même bizarrerie). La chose ennuyeuse ici est qu'une plage `` manuelle '' spécifiée aveccreated__gte ... created__lte=date(2014, 2, 1)
ne fonctionne pas non plus, ce qui est certainement à mon humble avis contre-intuitif.Est simple,
Travaille pour moi
la source
Pour le rendre plus flexible, vous pouvez concevoir un FilterBackend comme ci-dessous:
la source
Toujours d'actualité aujourd'hui. Vous pouvez également faire:
la source