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 %}
我有 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 %}