Django:如何根据孩子的孩子数来订购一套?

时间:2014-12-23 23:29:39

标签: python django

所以我有两个多对一的关系(Parent -> Child -> SubChild),我想按照他们拥有的子女数来订购父母。

我似乎无法弄清楚如何优雅地做到这一点。这是我到目前为止所提出的:

parents = Parent.objects.all()

parents_map = {}

for p in parents:
    total = 0
    children = Child.objects.filter(parent=p)
    for c in children:
        total += Subchildren.objects.filter(child=c).count()

    parents_map[p] = total

# sort the dict into a list of tuples
parents_list = sorted(parents_map.items(), key=operator.itemgetter(1), reverse=True)

parents = []

for p in parents_list:
    parents.append(p[0])

return parents

它有效,但我想知道:有更好/更快/更优雅的方式吗?

编辑:问题是为了概括而简化的,但我需要的是按子子项的数量对父母进行排序,以防这会影响你的答案!

2 个答案:

答案 0 :(得分:2)

这个怎么样?在Parent类中定义subchildren_count:

class Parent(models.Model):

    @property
    def subchildren_count(self):
        return Subchildren.objects.filter(child__parent=self).count()

然后通过该属性订购它们

答案 1 :(得分:2)

实际上,你只需要一个声明,就可以获得子孙所订购的父列表,而无需使用' sorted'功能。 在Child模型类中对ForeignKey字段(对于Parent)进行Asumming具有相关的' children',并且SubChild模型类中的ForeignKey字段(to Child)具有相关的子对象' ,这是正确的陈述:

return Parent.objects.all().annotate(
         count_subchildren=Count('children__subchildren')
       ).order_by('-count_subchildren')

希望这会对你有所帮助。