Установите приоритет для набора запросов в 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')
Однако это приведет к линейному поиску, поэтому, если количество категорий велико, это не хорошая идея.