select_related order_by example cual consultas avanzadas python django sql-order-by

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 especifica get_latest_by , puede dejar fuera el argumento field_name en latest() . Django usará el campo especificado en get_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?


Esto funcionó para mí

latestsetuplist = SetupTemplate.objects.order_by(''-creationTime'')[:10][::1]


Supongo que se trata de un error conocido en Django que se solucionó después de que se lanzó 1.3.