如何在ManyToManyField中标注查询集if对象



我试图建立一个小的社交网络,用户可以喜欢的帖子。我使用的是Django 3.1.7。我已经定义了我的模型的职位如下:

class Post(models.Model):
date_published = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.CharField(max_length=240, blank=False, default=None)
user_like = models.ManyToManyField(User, blank=True, related_name='likes')
def __str__(self):
return f'{self.user.username} posted "{self.content}" on {self.date_published}'

从我的views.py中,我想返回带有当前用户是否喜欢给定帖子的注释的帖子。我正在尝试如下:

def index(request):
posts = Post.objects.all().annotate(
likes=Count('user_like')).order_by('-date_published')
if request.user.is_authenticated:
posts = Post.objects.all().annotate(
likes=Count('user_like'), liked=request.user in 'user_like'.all).order_by('-date_published')

paginator = Paginator(posts, 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, "network/index.html", {
'post_form': PostForm(),
'page_obj': page_obj
})

但不幸的是,我不能使查询工作。我假设我检查用户是否在关系中的部分是错误的(liked=request.user in 'user_like'.all),因为它将'user_like'视为str,而不是Post中的字段。

我应该如何注释帖子,包括用户是否喜欢他们或不基于他们之间的ManyToManyField?由于

您可以使用Exists子查询<一口>[Django-doc]:

from django.db.models import Exists, OuterRef
posts = Post.objects.annotate(
likes=Count('user_like'),
liked=Exists(Post.user_like.through.objects.filter(
post_id=OuterRef('pk'),
user_id=request.user.pk
))
).order_by('-date_published')

最新更新