Установите приоритет для набора запросов в django

это моя модель товара и категории:

class Category(models.Model):
      name = models.CharField(max_length=100)

class Product(models.Model):
      ...
      category = models.ForeignKey(Category, related_name="products", on_delete=models.CASCADE)

Мне нужен список всех продуктов в приоритетном порядке.

например,

идентификаторы категорий_ = [3,5,1,4,2]

теперь я хочу, чтобы данные были упорядочены следующим образом

[товар_с_категорией_3, товар_с_категорией_3, товар_с_категорией_3, товар_с_категорией_5, товар_с_категорией_1, товар_с_категорией_1, ...]

Мы можем определить приоритет на основе категории и выражения Case-When:

from django.db.models import Case, Value, When

category_ids = [3, 5, 1, 4, 2]

Product.objects.filter(
    category_id__in=category_ids
).alias(
    priority=Case(*[When(category_id=k, then=Value(i)) for i, k in enumerate(category_ids)])
).order_by('priority')

Однако это приведет к линейному поиску, поэтому, если количество категорий велико, это не хорошая идея.

Вернуться на верх