python - example - order_by django
Django Query usando.order_by() y.latest() (3)
Hubiera esperado que .latest () siempre devuelva la instancia más reciente en función de un campo (fecha) (hora).
La documentation dice que
Si el
Meta
su modelo especificaget_latest_by
, puede dejar fuera el argumentofield_name
enlatest()
. Django usará el campo especificado enget_latest_by
de manera predeterminada.
Todo esto significa que cuando dispare MyModel.objects.latest()
obtendrá la última instancia basada en el campo de fecha / hora. Y cuando probé su código usando datos de muestra, efectivamente lo hizo.
Y luego, quise instancias.latest (), pero no me dio la instancia correcta, de hecho, me dio la primera instancia.
Has malentendido la forma en que funciona latest()
. Cuando se llama a MyModel.objects , devuelve la última instancia en la tabla . Cuando se llama a un conjunto de consulta , el latest
devolverá el primer objeto en el conjunto de consulta . Su queryset consistió en todas las instancias de MyModel
ordenadas por creation_date
en orden ascendente. Es natural que la latest
en este conjunto de consulta devuelva la primera fila del conjunto de preguntas . Por cierto, esta es la fila más antigua de la tabla .
Una forma de obtener una mejor comprensión es ver la consulta activada para el latest
.
Caso 1:
from django.db import connection
MyModel.objects.latest()
print connection.queries[-1][''sql'']
Esto imprime:
SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" DESC LIMIT 1
Tenga en cuenta el orden por creation_date DESC
y la cláusula LIMIT
. El primero es gracias a get_latest_by
mientras que el último es la contribución de latest
.
Ahora, caso 2:
MyModel.objects.order_by(''creation_date'').latest()
print connection.queries[-1][''sql'']
huellas dactilares
SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" ASC LIMIT 1
Tenga en cuenta que el orden ha cambiado a creation_date ASC
. Este es el resultado del orden explícito_by. El LIMIT
se pega en er, más tarde cortesía.
Veamos también el Caso 3: donde especifica explícitamente el nombre de campo para objects.latest()
.
MyModel.objects.latest(''id'')
print connection.queries[-1][''sql'']
muestra
SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM "app_mymodel"
ORDER BY "app_mymodel"."id" DESC LIMIT 1
Tengo un modelo:
class MyModel(models.Model):
creation_date = models.DateTimeField(auto_now_add = True, editable=False)
class Meta:
get_latest_by = ''creation_date''
Tuve una consulta en mi opinión que hizo lo siguiente:
instances = MyModel.objects.all().order_by(''creation_date'')
Y luego, quise instances.latest()
, pero no me dio la instancia correcta, de hecho, me dio la primera instancia. Solo cuando configuré order_by en -creation_date o realmente eliminé el order_by de la consulta, .latest()
me proporcionó la instancia correcta. Esto también ocurre cuando pruebo esto manualmente usando el shell python manage.py en lugar de en la vista.
Entonces, lo que he hecho ahora es en el Meta del Modelo. He enumerado order_by = [''creation_date'']
y no lo he usado en la consulta, y eso funciona.
Hubiera esperado que .latest()
siempre devuelva la instancia más reciente en función de un campo (fecha) (hora). ¿Podría alguien decirme si es correcto que .latest()
comporte de manera extraña cuando usa order_by
en la consulta?