Разделение набора запросов на группы без использования нескольких запросов

Как получить готовый набор запросов, разделенный на две части, из одной модели с помощью одного обращения к базе данных? Например, мне нужно получить 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
)
Вернуться на верх