Choisissez entre deux dates avec Django

116

Je cherche à faire une requête qui sélectionne entre les dates avec Django.

Je sais comment faire cela assez facilement avec du SQL brut, mais comment cela pourrait-il être réalisé en utilisant Django ORM?

C'est là que je veux ajouter les dates entre 30 jours dans ma requête:

start_date = datetime.datetime.now() + datetime.timedelta(-30)
context[self.varname] = self.model._default_manager.filter(
    current_issue__isnull=True
    ).live().order_by('-created_at')
Jeff Taggarty
la source

Réponses:

230

Utilisez l' __rangeopérateur:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))
Daniel Roseman
la source
Est-ce que "created_at" est un champ arbitraire dans un modèle ou s'agit-il du journal réel de la base de données lorsque l'enregistrement a été créé?
Bigbob556677
@ Philip556677 C'est un champ arbitraire dans un modèle. Vous pouvez définir le paramètre auto_now_add de DateField sur True afin de l'avoir facilement.
Benbb96
21

__range

Ignacio Vazquez-Abrams
la source
1

deux méthodes

.filter(created_at__range=[from_date, to_date])

une autre méthode

.filter(Q(created_at__gte=from_date)&Q(created_at__lte=to_date))
  • gte signifie supérieur à égal
  • lte signifie moins qu'égal
Manjuanth VM
la source
Q Objects n'est pas nécessaire dans la deuxième méthode, vous pouvez écrire:.filter(created_at__gte=from_date, created_at__lte=to_date)
CarMoreno
0

Si vous utilisez a DateTimeField, le filtrage avec des dates n'inclura pas les éléments du dernier jour.

Vous devez convertir la valeur en date:

...filter(created_at__date__range=(start_date, end_date))
suhailvs
la source