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')

Réponses:


230

Utilisez l' __rangeopérateur:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))

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


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

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))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.