Django заказ по комбинации прямых и смежных полей
У меня есть следующие модели:
class Product(models.Model):
name = models.CharField(max_length=50)
stock_quantity = models.IntegerField()
class Variation(models.Model):
parent_product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='variations')
stock_quantity = models.IntegerField()
Я хочу отсортировать набор продуктов по количеству на складе.
Теперь у меня есть два типа продуктов:
- простые продукты, у которых есть stock_quantity, непосредственно связанный с ними
- переменные продукты, у которых stock_quantity - None, но есть Variations, которые указывают на них через внешний ключ. В этом случае все вариации имеют значение stock_quantity .
Для переменных продуктов я хочу, чтобы сумма всех количеств переменных запасов была релевантна для сортировки.
Как я могу это сделать?
У меня в голове есть некоторые идеи об аннотациях и агрегатах, но я не уверен, как все это совместить.
Спасибо!
Product.objects.alias(true_quantity=Case(When(stock_quantity__isnull=True, then=Sum("variation__stock_quantity")), default=F('stock_quantity')).order_by('true_quantity')
alias() позволяет использовать дополнительные кулуары внутри вашего набора результатов, такие как связанные или вычисляемые (alias()
не раскрывает значение при манипулировании строками с помощью Python, используйте annotate() если хотите, чтобы true_quantity
возвращалось).
Case()/When() позволяет использовать условные выражения.
Приведенный выше запрос должен дать результат, пожалуйста, сообщите мне, если что-то осталось неясным