所以我有两个多对一的关系(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
它有效,但我想知道:有更好/更快/更优雅的方式吗?
编辑:问题是为了概括而简化的,但我需要的是按子子项的数量对父母进行排序,以防这会影响你的答案!
答案 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')
希望这会对你有所帮助。