Django - Получение последнего созданного объекта, одновременные фильтры
-
12-09-2019 - |
Вопрос
Прошу прощения, я совершенно новичок в 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 )
Тогда вы сможете легко получить последний объект с помощью этого последнего ПК.