Frage

Ich versuche, das Äquivalent der folgenden SQL in Django zu tun:

SELECT * FROM Antragsteller WHERE date_out - date_in> = 1 UND date_out - date_in <= 6

Ich kann dies als eine SQL-Abfrage RAW tun, aber dies frustrierend ist immer mit einem RawQuerySet anstelle einem normalen QuerySet Objekt im Umgang, wie ich möchte in der Lage sein, um es im Code später zu filtern.

War es hilfreich?

Lösung

Sie können die extra() Methode verwenden, und übergeben Sie in einem where Schlüsselwort-Argument. Der Wert von where sollte eine Liste sein, die die SQL WHERE-Klausel der Abfrage oben enthält. Getestet habe ich diese mit Postgresql 8.4 und das ist, wie es in meinem Fall sah:

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

Dies wird zurückkehren Sie eine gültige QuerySet Instanz.

Andere Tipps

Ich kam über die Ausgabe von Django nicht nativ unterstützt Datediff (und andere Datenbank-Äquivalente) und benötigt eine solche Funktion viele Male für ein bestimmtes Projekt zu verwenden.

Bei der weiteren Lektüre, wurde klar, dass die Umsetzung eines Intervalls von zwei Daten unterscheidet sich stark zwischen den großen Datenbank Aromen zu berechnen. Dies ist wahrscheinlich, warum es nicht eine native Abstraktionsfunktion in Django noch bekam. Also habe ich meine eigene Django ORM-Funktion für datediff schrieb:

Siehe auch: mike-db-tools Github-Repository

Sie werden die unterschiedliche Syntax zwischen dem Datenbank-Backends geschrieben in den Docstrings für die jeweiligen Datenbanken sehen. DATEDIFF unterstützt SQLite MySQL / MariaDB, PostgreSQL und Oracle.

Usage (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)

Ich bin wirklich ganz Derpy, wenn es um meinen Code kommt, so dass ich Sie ermutigen, gabeln und zu verbessern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top