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)
Каков правильный синтаксис, если он есть?
Ответы
Ответ 1
Я еще не пробовал, но я бы посмотрел на оператор last() на QuerySets:
последняя (имя_поль = нет)
Возвращает последний объект в таблицу, по дате, используя поле_имя в качестве поля даты.
В этом примере возвращается последняя запись в таблице, согласно Поле pub_date:
Entry.objects.latest( 'pub_date')
Если ваша модель Meta указывает get_latest_by, вы можете оставить аргумент field_name для last(). Django будет использовать поле, указанное в get_latest_by по умолчанию.
Как get(), последний() повышает DoesNotExist, если объект не существуют с заданными параметрами.
Примечание last() существует исключительно для удобство и удобочитаемость.
И модельные документы на get_latest_by:
get_latest_by
Options.get_latest_by
Имя объекта DateField или DateTimeField в модели. Это указывает поле по умолчанию для использования в последнем методе диспетчера модели.
Пример:
get_latest_by = "order_date"
Подробнее см. в документах для последних().
Изменить: Уэйд имеет хороший ответ на операторе Q().
Ответ 2
это работает!
Model.objects.latest('field')
- поле может быть id. это будет последний id
Ответ 3
Для основного первичного ключа попробуйте следующее:
List.objects.order_by('-pk')[0]
Обратите внимание, что использование pk
работает независимо от фактического имени поля, определенного как ваш первичный ключ.
Ответ 4
Поскольку Django 1.6 - последний
last()
Работает как first()
, но возвращает последний объект в наборе запросов.
Возвращает последний объект, соответствующий запросу, или None
, если нет соответствующего объекта. Если QuerySet не имеет определенного порядка, то запрос автоматически упорядочивается с помощью первичного ключа.
list = List.objects.last()
дает вам последний созданный объект
Ответ 5
Вы можете использовать метод count() для набора запросов, чтобы получить количество элементов.
list = List.objects.all()
list.count()
Аргументы для фильтрации "AND" совместно. Если вам нужно, чтобы фильтры OR отображали объекты Q.
http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects
Ответ 6
альтернатива для последнего созданного объекта:
List.objects.all()[List.objects.count()-1]
Необходимо добавить AssertionError для случая, когда в списке нет элементов.
except AssertionError:
...