Django:按多对多关系字段排序

时间:2010-11-29 23:13:44

标签: python django sorting django-models

鉴于django模型A和B:

class A(models.Model):
    things = models.ManyToManyField('B')

class B(models.Model):
    score = models.FloatField()
    text = models.CharField(max_length=100)

如何获取A中得分最高的text B订购的things个实体列表?

2 个答案:

答案 0 :(得分:2)

如果我理解正确的话,应该这样做。 list将包含模型A的所有对象的列表,按每个对象的最高得分事物的文本排序。

dict = {}
list = []
for a in A.objects.all():
    dict[a] = a.things.all().order_by("-score")[0].text
for k, v in sorted(dict.items(), key=lambda x: x[1]):
    list.append(k)

可能有一种更漂亮的方式来写它,但我想不出一个在我的头顶...

答案 1 :(得分:2)

这种事情真的很难。如果您想按得分排序,聚合可以帮助您:

from django.db.models import Max
A.objects.annotate(highest_b=Max(B__score)).order_by('highest_b')

但实际上你想要做两个操作:按最高分进行聚合,然后按照该分数的项目文本进行排序。无论你使用什么语言,这都很棘手。我已经写过关于这个问题on my blog - 为了你的目的,我认为通过.raw()方法在SQL中做这个可能是最简单的。