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
记录。
有几个表,我根据模型成功地导出到 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
记录。