<p>这本质上是一个建模问题。而不是像这样定义一个模型:</p>
<pre><code># modeling with data duplication
class SomeModel(models.Model):
title = models.CharField(max_length=256)
publisher = models.CharField(max_length=256)
doi = models.CharField(max_length=256)
publication_type = models.CharField(max_length=128)
year = models.IntegerField()
date = models.DateField()
counts = models.IntegerField()</code></pre>
<p>您应该创建一个类似<code>Publication</code>的模型,并将<code>SomeModel</code>链接到该<code>Publication</code>,如:</p>
<pre><code># modeling without data duplication
class <b>Publication</b>(models.Model):
title = models.CharField(max_length=256)
publisher = models.CharField(max_length=256)
doi = models.CharField(max_length=256)
publication_type = models.CharField(max_length=128)
year = models.IntegerField()
class PublicationSale(models.Model):
<b>publication = models.ForeignKey(Publication, on_delete=models.CASCADE)</b>
date = models.DateField()
counts = models.IntegerField()</code></pre>
<p>这将减少数据库的大小,降低数据库不一致的可能性(例如,如果更改发布年份,某些记录未正确更新),并可能使数据库在某些查询中运行得更快</p>
<p>在这种情况下,您可以像这样查询:</p>
<pre><code>from django.db.models import Sum
Publication.objects.annotate(
<b>total=Sum('publication_sale__counts')</b>
)</code></pre>
<p>然后检索带有<code>Publication</code>对象的<code>QuerySet</code>,该对象带有一个额外属性<code>.totals</code>,即与<em>相关的</em><code>PublicationSale</code>对象的<code>counts</code>之和</p>
<p>如果不进行此重塑,可以使用:</p>
<pre><code>from django.db.models import <b>Sum</b>
qs = self.model.objects.filter(q_report).values(
'title', 'publisher', 'doi', 'publication_type', 'year'
).<b>annotate(
total=Sum('counts')
)</b>.order_by(
'title', 'publisher', 'doi', 'publication_type', 'year'
)</code></pre>
<p>然后产生<code>QuerySet</code>个字典:</p>
<pre><code><QuerySet [
{'title': 'Title A', 'publisher': 'pubA', ..., 'total': 11},
{'title': 'Title B', 'publisher': 'pubA', ..., 'total': 7},
{'title': 'Title A', 'publisher': 'pubB', ..., 'total': 3},
]>
</code></pre>
<p>但是正如您所看到的,查询不会产生模型,而且有点“不稳定”,即每次添加“功能相关实体”的额外数据时,都需要更新查询</p>