Разделение набора запросов на группы без использования нескольких запросов
Как получить готовый набор запросов, разделенный на две части, из одной модели с помощью одного обращения к базе данных? Например, мне нужно получить is_featured=True
отдельно и is_featured=False
отдельно.
Я пробовал использовать функцию фильтрации в python, но я хочу сделать это самостоятельно с помощью самого запроса, возможно ли это.
Я хочу добавить 2 тематических и 8 органических продуктов на одну страницу. В общем, правильно ли будет разделить их на две группы, вывести их, а затем установить правильную позицию для каждой?
p = Product.objects.all()
featured_products = filter(lambda p: p.is_featured, p)
list(featured_products)
[<Product: Nexia sotiladi | 2024-12-06 | -20241206>, <Product: Nexia sotiladi | 2024-12-06 | -20241206>`
these are is_featured=True
Это то, что я сделал с помощью функции фильтрации python
Вы можете использовать itertools.groupby(…)
[python-doc] для постобработки запроса:
from itertools import groupby
from operator import attrgetter
result = {
k: list(vs)
for k, v in groupby(
Product.objects.order_by('is_featured'), attrgetter('groupby')
)
}
Это сделает один запрос и создаст словарь, в котором значение is_featured
будет отображено на список Product
элементов.
Я хочу добавить на одну страницу 2 тематических и 8 органических продуктов. В общем, правильно ли будет разделить их на две группы, вывести их, а затем установить правильную позицию для каждой?
Для этого вы можете использовать .union(…)
[Django-doc]:
Product.objects.filter(is_featured=True)[:2].union(
Product.objects.filter(is_featured=False)[:8],
all=True
)