Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django order_by()和带注释的独立(<;field>;)命令_Python_Django_Orm - Fatal编程技术网

Python Django order_by()和带注释的独立(<;field>;)命令

Python Django order_by()和带注释的独立(<;field>;)命令,python,django,orm,Python,Django,Orm,我在Ubuntu13.04上使用Django1.4和Python2.7 我知道在Django中跨关系使用order\u by()和distinct()会有问题。似乎大多数建议的解决方案都是使用聚合。我不知道我怎么能在我的情况下做到这一点 我有一个已预筛选的QuerySet。我需要按2个字段排序,然后通过一个不同的外键获得结果 class Contract(models.Model): rpl = models.DecimalField(max_digits=20, decimal_pla

我在Ubuntu13.04上使用Django1.4和Python2.7

我知道在Django中跨关系使用
order\u by()
distinct()
会有问题。似乎大多数建议的解决方案都是使用聚合。我不知道我怎么能在我的情况下做到这一点

我有一个已预筛选的
QuerySet
。我需要按2个字段排序,然后通过一个不同的外键获得结果

class Contract(models.Model):
    rpl = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    priority = models.IntegerField(default=0)

class Offer(models.Model):
    contract = models.ForeignKey(Contract)
    product = models.ForeignKey(Product)
我需要得到一份报价清单,先按合同优先级排序,然后按合同rpl排序。因此,我需要提供不同的产品

qs.order\u by('-contract\u priority','-contract\u rpl')。独特的('product')


对于Django,我该如何优雅地做到这一点?

似乎您需要的是一个分组声明,不幸的是Django没有提供这一点-请看这个问题

就我个人而言,我可能会从另一个角度来处理它,并使用产品查询集。您可以按注释的优先级/rpl值筛选报价字段和订单,然后对于每个产品,您需要分别检索报价详细信息。这意味着每行都有一个额外的查询,但这可能是您所能做的最好的了。例如:

Product.objects.filter(offer__...=...) \
               .annotate(priority=models.Max('offer__contract__priority'),
                         rpl=models.Max('offer__contract__rpl')) \ 
               .order_by('-priority', '-rpl')
这可能是.raw()的情况?我碰巧喜欢SQL。