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() позволяет использовать условные выражения.

Приведенный выше запрос должен дать результат, пожалуйста, сообщите мне, если что-то осталось неясным

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