2016-08-31 3 views
0

Я только что узнал о методе latest(). Я пошел к документации django, чтобы узнать больше об этом. В документации написано:Использование метода last() с типами полей, отличных от поля даты (Django)

latest(field_name=None)

Возвращает последний объект в таблице, по дате, используя field_name при условии, как поле даты.

Однако в учебнике, что я следую, этот метод используется вместе с именем поля для models.PositiveIntegerField() поля (и модель не определяет get_latest_by). Я пытался найти объяснение и подобное использование этого метода, где field_name отличается от поля даты.

Я нашел некоторую информацию here, где говорится, что:

... он, вероятно, работать с другими общих упорядоченных типов тоже, но не уверен ...

и

Это делает работу с первичными ключами ...

Также я нашел аналогичный случай here, где метод latest() используется с полем id.

Однако все же я не нашел ответа, можно ли использовать этот метод с чем-то другим, кроме поля даты? Есть ли другой метод, который более подходит для такого рода задач?

ответ

0

Here's the source code for _earliest_or_latest, который регулирует метод latest. Как вы можете видеть, он в основном использует любое имя поля, которое вы указываете, и старается наилучшим образом упорядочить поиск по этому полю на уровне базы данных. Он делает это с помощью метода add_ordering, который is documented in the source code here.

Ничего необычного, что происходит под капотом - Django просто передает ORDER BY и позволяет базе данных попытаться разобраться. Вот почему вы видите противоречивое поведение между средами базы данных, например, как SQLite сортирует значения NULL ниже ненулевых значений, в то время как MySQL и PostgreSQL делают обратное. Django на самом деле не заказывает набор запросов, это базовая база данных.

Такие вещи, как даты, инкрементированные идентификаторы и т. Д., Легко настраиваются для баз данных и поэтому хорошо работают с latest. А UUIDField, с другой стороны, вероятно, не будет работать так хорошо.