Group と Person の 2 つのモデルを持つ Django プロジェクトがあります。グループには、Person オブジェクトまたは他の Group オブジェクトを含めることができます。グループは循環を形成できません (つまり、グループ A を含むグループ B を含み、グループ A を含みます)。その結果、Person オブジェクトがリーフであるツリー構造になります。
私の質問は、できるだけ少ない SQL クエリで、高レベルのグループ (ルート グループなど) 内に含まれるすべての Group オブジェクトと Person オブジェクトをカウントするにはどうすればよいですか?
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 オブジェクト内に保存する必要がありますか?