Question

Je suis en train de faire l'équivalent de l'instruction SQL suivante dans Django:

SELECT * FROM demandeur OÙ date_out - date_in> = 1 ET date_out - date_in <= 6

Je peux le faire comme la requête de RAW, mais cela devient frustrant dans le traitement d'un RawQuerySet au lieu d'un objet régulier queryset que je voudrais être en mesure de filtrer plus tard dans le code.

Était-ce utile?

La solution

Vous pouvez utiliser la méthode extra() et passer un argument de mot-clé where. La valeur de where doit être une liste qui contient la clause de WHERE SQL de la requête ci-dessus. Je l'ai testé cela avec Postgresql 8.4 et voici ce qu'elle avait l'air comme dans mon cas:

q = Applicant.objects.extra(where = ["""date_part('day', age(date_out, date_in)) >= 1 and
      date_part('day', age(date_out, date_in)) <= 6"""])

Cela vous renvoie une instance de QuerySet valide.

Autres conseils

Je suis tombé sur la question de Django ne supportant pas nativement Datediff (et d'autres équivalents de base de données), et avait besoin d'utiliser une telle fonction à plusieurs reprises pour un projet particulier.

En continuant la lecture, il est apparu clairement que la mise en œuvre du calcul d'un intervalle de deux dates diffère largement entre les saveurs de base de données principales. Ceci est sans doute pourquoi il n'a une fonction d'abstraction native encore Django. Alors, je l'ai écrit ma propre fonction Django ORM pour datediff:

Voir: micro-db-tools dépôt Github

Vous verrez la syntaxe variant entre la base de données backends écrites dans les docstrings pour les bases de données respectives. Datediff supports SQLite, MySQL / MariaDB, PostgreSQL et Oracle.

Utilisation (Django 1.8 +)

:

from db_tools import Datediff

# Define a new dynamic fields to contain the calculated date difference
applicants = Applicant.objects.annotate(
    days_range=Datediff('date_out','date_in', interval='days'),
)

# Now you can use this dynamic field in your standard filter query
applicants = applicants.filter(days_range__gte=1, days_range__lte=6)

Je Derpy vraiment quand il vient à mon code, je vous encourage donc à la fourchette et d'améliorer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top