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

Извинения, я совершенно новичок в 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)

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

Ответы [ 7 ]

52 голосов
/ 10 августа 2009

Я еще не пробовал, но я посмотрю на оператор latest () для QuerySets :

последнее (field_name = None)

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

Этот пример возвращает последнюю запись в таблице, согласно Поле pub_date:

Entry.objects.latest ( 'pub_date')

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

Как get (), последний () повышает DoesNotExist, если объект не существуют с данными параметрами.

Обратите внимание, что последняя () существует исключительно для удобство и удобочитаемость.

И документация на get_latest_by :

get_latest_by

Options.get_latest_by

Имя DateField или DateTimeField в модели. Здесь указывается поле по умолчанию для использования в последнем методе диспетчера моделей.

Пример: * 1 034 *

get_latest_by = "order_date"

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

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

27 голосов
/ 11 декабря 2009

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

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

15 голосов
/ 10 августа 2009

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

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

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

13 голосов
/ 17 ноября 2015

С Django 1.6 - последний

last()

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

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

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

3 голосов
/ 10 августа 2009

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

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

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

0 голосов
/ 14 февраля 2018

Я работаю над 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 )

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

0 голосов
/ 23 июля 2014

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

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

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

except AssertionError:
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...