#python #django
Вопрос:
Я знаю, что вы можете добавить [:n]
в конец набора запросов, чтобы отфильтровать этот набор запросов от начала до n-го объекта. Например.
qs = Item.objects.all()
range = qs[:5] # Returns first five objects
Возможно ли отфильтровать набор запросов от начала до определенного объекта? например
qs = Item.objects.all()
obj = Item.objects.get(pk="123")
# How to return the qs from the beginning to obj?
Редактировать:
Я нашел следующие два решения… Я считаю y
, что это наиболее эффективный? Есть ли лучший способ сделать это?
x = (*qs,).index(obj)
return qs[:x]
y = list(qs.values_list("id", flat=True)).index(obj.id)
return qs[:y]
Комментарии:
1. Разве
Item.objects.get(pk__lte="123")
это не вариант?2. @BrianDestura к сожалению, нет. Мой конкретный вариант использования — использование метода материализованного пути django-treebeard для вложенных данных. По сути, я хочу вернуть набор запросов всех потомков перед конкретным объектом. Итак, сортировка по pk, создание, изменение и т. Д. не будет работать
3. А. Использование treebeard было важным контекстом, поэтому вы можете захотеть обновить вопрос с его помощью. В любом случае, будет ли get_ancestors работать в соответствии с вашими требованиями?
4. @BrianDestura Мое начальное
qs
знакомство с django-treebeard в настоящее времяItem.get_root().get_children()