Django 通过直接字段和相关字段的组合进行排序

问题描述 投票:0回答:1

我有以下型号:

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
  • 可变产品,其 stock_quantity 为 None,但具有通过外键指向它们的变体。在这种情况下,所有变体都有一个 stock_quantity

对于可变产品,我希望所有变化库存数量的总和与排序相关。

我该怎么做?

我确实对注释和聚合有一些想法,但不确定如何将它们组合在一起。

python django postgresql django-orm
1个回答
0
投票
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 操作行时不会公开该值,如果您希望 true_quantity 为已返回)。

Case()/When()

允许条件表达式。 上述查询应该会产生您的结果,如果有任何不清楚的地方请告诉我

© www.soinside.com 2019 - 2024. All rights reserved.