Django - Получение последнего созданного объекта, одновременные фильтры

StackOverflow https://stackoverflow.com/questions/1256190

Вопрос

Прошу прощения, я совершенно новичок в Django и Python.

У меня есть 2 вопроса.Во-первых, как бы мне получить последний созданный объект (или наивысший pk) в списке объектов?Например, я знаю, что я мог бы использовать следующее, чтобы получить первый объект:

list = List.objects.all()[0]

Есть ли способ получить длину List.objects?Я пробовал List.objects.length, но безрезультатно.

Во-вторых, возможно ли создавать одновременные фильтры или объединять списки?Вот такой пример:

def findNumber(request, number)
    phone_list = Numbers.objects.filter(cell=number)

Я хочу что-то подобное вышеописанному, но больше похожее:

def findNumber(request, number)
    phone_list = Numbers.objects.filter(cell=number or home_phone=number)

Каков правильный синтаксис, если таковой имеется?

Это было полезно?

Решение

Я еще не пробовал этого, но я бы посмотрел на последняя версия () оператор включен Наборы запросов:

последняя версия(имя_поля=Отсутствует)

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

В этом примере возвращается последняя запись в таблице в соответствии с полем pub_date:

Запись.объекты.последняя('pub_date')

Если в Meta вашей модели указано get_latest_by , вы можете не указывать аргумент field_name в latest().Django по умолчанию будет использовать поле, указанное в get_latest_by.

Подобно get(), latest() вызывает DoesNotExist, если объект не существует с заданными параметрами.

Примечание: latest() существует исключительно для удобства и удобочитаемости.

И тот документы модели на get_latest_by:

получите_latest_by

Параметры.get_latest_by

Имя поля даты или DateTimeField в модели.Это указывает поле по умолчанию для использования в последнем методе вашего model Manager.

Пример:

get_latest_by = "дата заказа"

Подробнее смотрите в документации для latest().

Редактировать:У Уэйда есть хороший ответ по оператору Q().

Другие советы

это работает!

Model.objects.latest('field') - поле может быть идентификатором.это будет последний идентификатор

Для получения самого большого первичного ключа попробуйте следующее:

List.objects.order_by('-pk')[0]

Обратите внимание, что использование pk работает независимо от фактического имени поля, определенного как ваш первичный ключ.

Начиная с Django 1.6 - последний

last()

Работает как first(), но возвращает последний объект в наборе запросов.

Возвращает последний объект, соответствующий набору запросов, или None если нет соответствующего объекта.Если в QuerySet не определен порядок, то набор запросов автоматически упорядочивается по первичному ключу.

list = List.objects.last() дает вам последний созданный объект

Вы можете использовать метод count() в наборе запросов, чтобы получить количество элементов.

list = List.objects.all()
list.count()

Аргументы для фильтрации объединяются «И».Если вам нужно использовать фильтры OR, посмотрите на объекты Q.http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

альтернатива для последнего созданного объекта:

List.objects.all()[List.objects.count()-1]

Необходимо добавить AssertionError на случай, когда в списке нет элементов.

except AssertionError:
   ...

Я работаю над версией Django 1.4.22, ни last ни lastet работает.Мой способ решения с минимальной загрузкой БД выглядит следующим образом:

latest = lambda model_objects, field : model_objects.values_list( field, flat = True ).order_by( "-" + field )[ 0 ]
latest_pk = latest( List.objects, "pk" )

Эта функция принимает query_set в качестве входных данных.

Вы можете связать эту функцию динамически, выполнив:

import types
List.objects.latest = types.MethodType( latest, List.objects )

Тогда вы сможете легко получить последний объект с помощью этого последнего ПК.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top