Pregunta

Estoy tratando de hacer el equivalente de la siguiente SQL en Django:

SELECT * FROM solicitante DONDE date_out - date_in> = 1 y date_out - date_in <= 6

Me puede hacer esto como una consulta SQL RAW, pero esto se está convirtiendo en frustrante tratar con un RawQuerySet lugar de un objeto QuerySet regular como me gustaría ser capaz de filtrar más adelante en el código.

¿Fue útil?

Solución

Se puede utilizar el método extra() y pasar en un argumento de palabra clave where. El valor de where debe ser una lista que contiene la cláusula WHERE SQL de la consulta anterior. He probado esto con PostgreSQL 8.4 y esto es lo que parecía que en mi caso:

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

Esto le devolverá una instancia QuerySet válida.

Otros consejos

Me encontré con el tema de Django no de forma nativa soporte Datediff (y otros equivalentes de base de datos), y necesitaba usar Tal función muchas veces para un proyecto en particular.

Tras la lectura adicional, se hizo evidente que la aplicación de cálculo de un intervalo de dos fechas difiere ampliamente entre los principales sabores de bases de datos. Esta es probablemente la razón por que no tiene una función de abstracción nativo en Django todavía. Así que escribí mi propia función de ORM de Django para datediff:

Ver: mike-db-herramientas Github repositorio

Se verá la sintaxis varía entre los backends de bases de datos escritos en las cadenas de documentación para las respectivas bases de datos. DATEDIFF soportes SQLite, MySQL / MariaDB, PostgreSQL y Oracle.

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

estoy realmente muy Derpy cuando se trata de mi código, así que animo a la mesa y mejorar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top