Django filtrer les événements qui se produisent aujourd'hui
J'ai du mal à représenter de façon logique les éléments suivants dans un Django filtre. J'ai un "événement" modèle, et d'un emplacement de modèle, qui peut être représenté par:
class Location(models.Model):
name = models.CharField(max_length=255)
class Event(models.Model):
start_date = models.DateTimeField()
end_date = models.DateTimeField()
location = models.ForeignKeyField(Location)
objects = EventManager()
Pour un emplacement donné, je veux sélectionner tous les événements qui se produisent aujourd'hui. J'ai essayé différentes stratégies via un 'bookings_today' méthode dans le EventManager, mais le droit de la syntaxe du filtre de m'échappe:
class EventManager(models.Manager):
def bookings_today(self, location_id):
bookings = self.filter(location=location_id, start=?, end=?)
date() échoue car cela remet à zéro les temps, et le temps au cours de la journée est essentiel à l'app, il en va de même pour min et max de dates, et de les utiliser comme des serre-livres. En outre, il existe de multiples possibilités de configurations valides:
start_date < today, end_date during today
start_date during today, end_date during today
start_date during today, end_date after today
Ai-je besoin de code d'un ensemble d'options différentes ou est-il plus simple et élégant méthode?
OriginalL'auteur jvc26 | 2012-06-28
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de deux distinctes
datetime
seuils -today_start
ettoday_end
:Tout ce qui se passe aujourd'hui doit avoir commencé avant
today_end
et terminé aprèstoday_start
, donc:(P. S. Ayant un
DateTimeField
(pas unDateField
) appeléfoo_date
est m'énerve à être si trompeuse - considérerstart
etend
...)datetime.now()
veuillezdatetime.maintenant() produire une AtrributeError
OriginalL'auteur
Vous avez besoin d'utiliser une gamme là comme ceci:
Oui, vous avez raison. fin__gte=aujourd'hui et commencez__lte=aujourd'hui doit être utilisé.
Bon, cela ne fonctionne pas, que la date de début pourrait tomber avant le départ d'aujourd'hui, ou après, et la date.aujourd'hui() ne semble pas en mesh avec datetime objets en termes d'égalité lors de la sélection.
lorsque vous comparez avec une date (au lieu d'un datetime), Django fait essentiellement une gamme de derrière les scènes à partir de 00:00 à 23:59. Je l'ai fait moi-même un nombre incalculable de fois, donc je sais que ça fonctionne. Si vous êtes à ont un problème avec Aidas code, il y a un autre problème à jouer.
mais ici nous sommes en train de comparer un datetime (datetime.maintenant()), avec un datetime (date_debut), qui, je suppose rend le temps d'une actualité brûlante?
OriginalL'auteur
Aucune des réponses que j'ai vu est le fuseau horaire courant.
Pourquoi ne pas simplement faire ceci à la place:
OriginalL'auteur
Comment à ce sujet:
pub_date__gte=datetime(2005, 1, 1)
? Utilisation_gte
et__lte
à la limite de début et de fin dans un délai d'un jour en utilisant le chaînage de méthode.Peut-être quelque chose comme
self.filter(start__gte=datetime(2005, 1, 1)).filter(end__lte=datetime(2005, 1, 1))
.lte
signifie inférieure ou égale à,gte
signifie une plus grande ou égale à.Je le trouve dans django doc.
OriginalL'auteur
Je pense exclure est votre ami ici!
OriginalL'auteur
timezone.localtime(timezone.now()).date()
vous obtient la date correcte.Des événements qui se produisent aujourd'hui(
start
aujourd'hui):OriginalL'auteur