【问题标题】:Django: order by field of many-to-many relationDjango:按多对多关系的字段排序
【发布时间】:2010-11-29 23:13:44
【问题描述】:

给定 django 模型 A 和 B:

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

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

如何获取things 中得分最高的Btext 排序的A 实体列表?

【问题讨论】:

    标签: python django sorting django-models


    【解决方案1】:

    如果我理解正确,应该这样做。 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)
    

    可能有更漂亮的写法,但我想不出一个...

    【讨论】:

    • 我倾向于支持您的方法,因为与 Daniel 的博客文章中所做的编写原始 SQL 或杂耍元组和字典相比,它非常简单。
    【解决方案2】:

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

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

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

    【讨论】:

    • 不幸的是,对于我的应用程序,dbms 可能因客户端而异,因此引入原始 SQL 查询将难以维护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2023-03-06
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多