it-roy-ru.com

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

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

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

29
zdyn

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

(Field_name = None) последняя

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

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

Entry.objects.latest ( 'pub_date')

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

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

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

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

get_latest_by

Options.get_latest_by

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

Пример:

get_latest_by = "order_date"

Смотрите документы для последней () для получения дополнительной информации.

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

47
hughdbrown

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

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

25
Harry

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

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

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

13
jcdyer

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

last()

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

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

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

11
punkrockpolly

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

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

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

3
Wade

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

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

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

except AssertionError:
   ...
0
RolandoAmir

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