Return 对于多对多关系查询,只有聚合计数而不是完整记录

Return only an aggregate count instead of the full record for a ManyToMany relationship query

有几个表,我根据模型成功地导出到 CSV。 但是,对于我计算 'likes' 的新闻(帖子),我一无所获。

这是我的模型:

class News(models.Model):
    news_title = models.CharField(max_length=300)
    news_text = models.TextField(max_length=2000)
    news_author = models.CharField(max_length=150)
    news_date = models.DateField(default=now)
    likes = models.ManyToManyField(User, related_name='user_like', blank=True)

    @property
    def total_likes(self):
        return self.likes.count()

问题是,我可以将模型中的所有项目打印成 CSV,但如果我打印“喜欢”,我会在 CSV 中得到重复的(或更多)行。 原因是,如果 News 被 3 个用户点赞,我会在 CSV 上为每个用户获得 3x 行,并在“Like Count”列下获得他们的 ID。

我想得到的是:每个新闻 1x 行,每个新闻的总喜欢数

和view.py

@login_required
def export_news(request):
    newss = News.objects.all()
    response = HttpResponse(content_type='txt/csv')
    writer = csv.writer(response)
    writer.writerow(["ID","Title","Author","Date","Text","Likes Count"])
    
    for news in newss.values_list('id','news_title','news_author','news_date','news_text','likes'):
        writer.writerow(news)
        
    response['Content-Disposition'] = 'attachment; filename="News_list.csv"'

    return response

感谢任何帮助。谢谢

您需要在 newss 查询集上注释点赞数,然后在 values_list 中调用该聚合值。类似于:

from django.db.models import Count

newss = News.objects.annotate(num_likes=Count('likes')).all()
...
for news in newss.values_list('id','news_title','news_author','news_date','news_text','num_likes'):
    writer.writerow(news)

您的问题是 values_list 查询确实会 return 每个匹配记录的列表项,就像您在 SQL 中进行此查询一样。因为您正在 returning likes,这不是 1:1 字段,所以对于此查询,您可能期望每个新闻项目有不止一行。如果您只想要汇总的聚合,则需要通过注释在查询中指定它,然后仅 return 注释值,而不是查询中的完整 likes 记录。