python - 如何编写查询以在 Django 中获取查询集
问题描述
我想获得特定作者撰写的所有帖子的点赞数。我尝试过类似下面的方法,
Post.objects.filter(author=1).liked.count()
但是,它返回
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'liked'
我可以通过以下方式获取特定帖子的点赞数,
Post.objects.filter(author=1).first().liked.count()
如何在我的 views.py 文件中处理这个逻辑?
模型.py:
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField(validators=[MinLengthValidator(200)])
liked = models.ManyToManyField(User, default=None, blank=True, related_name = 'liked')
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name = 'author')
def __str__(self):
return self.title
@property
def num_likes(self):
return self.liked.all().count()
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
LIKE_CHOICES = (
('Like', 'Like'),
('Unlike', 'Unlike'),
)
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
value = models.CharField(choices= LIKE_CHOICES,default='Like', max_length=10)
def __str__(self):
return str(self.post)
解决方案
你可以这样尝试aggregation
:
from django.db.models import Count, Sum
Post.objects.filter(author=1).annotate(like_count=Count('liked')).aggregate(total_likes=Sum('like_count'))['total_likes']
仅供参考,如果你有一个多对多关系模型,那么你可以使用这个:through
Like
Like.objects.filter(post__author_id=1).count()
或者
Like.objects.filter(post__author=request.user).count()
推荐阅读
- ios - 避免由于单元格中其他按钮的高度扩展而导致按钮高度扩展
- forms - react native 中的 ref 是什么,我什么时候应该使用 ref?
- azure-data-factory-2 - Blob 到 azure sql db 加载
- java - 在jackson中将一个字段从字符串更改为json对象
- javascript - 如何通过 create-react-app 项目在 SASS、SCSS 和 LESS 之间选择使用哪一个
- angular - 如何获取当前模块的所有路由?
- flutter - 如何在 Flutter 中的 HTTP 发布请求中传递标头?
- java - 蓝牙发现问题
- azure - Power BI 架构
- linux-kernel - 如何判断 System.map 中的符号是变量还是函数?