J'essaye de filtrer une DateTimeField
comparaison avec une date. Je veux dire:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
J'obtiens une liste de requêtes vide comme réponse parce que (je pense) je ne considère pas le temps, mais je veux "à tout moment".
Y a-t-il un moyen facile dans Django de faire cela?
J'ai le temps dans le datetime réglé, ce n'est pas le cas 00:00
.
Réponses:
Ces recherches sont implémentées
django.views.generic.date_based
comme suit:Comme il est assez détaillé, il est prévu d'améliorer la syntaxe à l'aide de l'
__date
opérateur. Cochez " # 9596 La comparaison d'un DateTimeField à une date est trop difficile " pour plus de détails.la source
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// éditer après les commentaires
ne fonctionne pas car il crée un objet datetime avec des valeurs d'heure définies sur 0, de sorte que l'heure dans la base de données ne correspond pas.
la source
Voici les résultats que j'ai obtenus avec la fonction timeit d'ipython:
contient semble être plus rapide.
la source
contains
solution, j'obtiens le message d'erreur:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
filtre. Mais si vous rencontrez des problèmes, vous devriez essayer l' exemple django docs qui utilise__gte
.startswith
solution ..Django dispose désormais d' un filtre __date queryset pour interroger les objets datetime par rapport aux dates dans la version de développement. Ainsi, il sera bientôt disponible en 1.9.
la source
ce qui précède est ce que j'ai utilisé. Non seulement cela fonctionne, mais il a également un support logique inhérent.
la source
Depuis Django 1.9, la façon de faire est d'utiliser
__date
sur un objet datetime.Par exemple:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
la source
Cela produit les mêmes résultats que l'utilisation de __year, __month et __day et semble fonctionner pour moi:
la source
en supposant que active_on est un objet date, incrémentez-le de 1 jour puis faites range
la source
Voici une technique intéressante - j'ai exploité la procédure startswith telle qu'implémentée avec Django sur MySQL pour obtenir le résultat de rechercher uniquement une date / heure à travers uniquement la date. Fondamentalement, lorsque Django effectue la recherche dans la base de données, il doit effectuer une conversion de chaîne pour l'objet de stockage DATETIME MySQL, vous pouvez donc filtrer sur cela, en laissant de côté la partie horodatage de la date - de cette façon% LIKE% ne correspond qu'à la date objet et vous obtiendrez chaque horodatage pour la date donnée.
Cela exécutera la requête suivante:
Le LIKE BINARY dans ce cas correspondra à tout pour la date, quel que soit l'horodatage. Y compris des valeurs telles que:
J'espère que cela aidera tout le monde jusqu'à ce que Django propose une solution!
la source
Il y a un article de blog fantastique qui couvre cela ici: Comparaison des dates et des heures de données dans l'ORM Django
La meilleure solution publiée pour Django> 1.7, <1.9 est d'enregistrer une transformation:
Ensuite, vous pouvez l'utiliser dans vos filtres comme ceci:
ÉDITER
Cette solution dépend définitivement du back-end. De l'article:
la source
return '{}::date'.format(lhs), params
Hm .. Ma solution fonctionne:
la source
la source
Dans Django 1.7.6 fonctionne:
la source
__lte
par exemple.Voir l'article Documentation Django
la source