Django:设计一对多计数查看的最佳方式

Django: best way to design one-to-many count viewing

我有 2 个模型 A 和 B,一个 A 模型可能在多个 B 模态中被引用:

class A(Model):
    name = CharField(...)

class B(Model):
    name = CharField(...)
    a = ForeignKey(A, related_name='all_B')

鉴于A模型我想显示有多少个B对象。 现在我这样做:

args={'a_all': A.objects.all()}
...
{% for a in a_all %}
   {{a.name}} : {{ a.all_B.objects.count }} <br>
{% endofr %}

但是,这将对每个 A 对象执行 SQL 查询,如果我在数据库表中有很多模型,这并不酷。

所以,我想在一次查询中获取所有计数。 select_related 在这种情况下不能使用,因为它只适用于一对一和多对一关系,而不适用于一对多。

我唯一想到的就是将计数器字段添加到 A:

class A(Model):
    name = CharField(...)
    b_count = PositiveIntegerField(...)

并在我更改关系时更新它。但是如果 add/delete/rewrite "a" 字段和 "B" 模态有很多视图,它会带来很多工作来检测所有关系的变化。

尝试:

A.objects.all().annotate(b_count = Count('b'))

然后对于 A 的每个实例,您可以执行 a_instance.b_count

试试这个:

a_all = A.objects.all().annotate(b_count =Count('b'))

这将为 A 的每个对象添加一个新字段 b_count。 然后在你的模板中你可以做类似

的事情
 {% for a in a_all %}
   {{a.name}} : {{ a.b_count }} <br>
{% endofr %}