我有一个 Django 项目,它有两个模型:Group 和 Person。组可以包含 Person 对象或其他 Group 对象。组不能形成一个循环(即,A 组包含 B 组,B 组包含 A 组),这导致了一个树结构,其中 Person 对象是叶子。
我的问题是 - 如何使用尽可能少的 SQL 查询来计算高级组(如根组)中所有包含的组对象和个人对象?
使用 O(N)(其中 N 是子组数)SQL 查询的简单方法是:
def Group(models.Model):
name = models.CharField(max_length=150)
parent_group = models.ForeignKey('self', related_name=child_groups, null=True, blank=True)
# returns tuple (# of subgroups, # of person objects)
def count_objects(self):
count = (self.child_groups.count(), self.people.count())
for child_group in self.child_groups.all():
# this adds tuples together ( e.g: (1,2) and (1,2) make (2,4) )
tuple(map(operator.add, count, child_group.count_objects()))
def Person(models.Model):
user = models.ForeignKey(User)
picture = models.ImageSpecField(...)
group = models.ForeignKey('Group', related_name="people")
有没有办法改善这一点,或者我应该只将这些值存储在 Group 对象中?