簡體   English   中英

如果在 ManyToManyField 中的 object,如何注釋查詢集

[英]How to annotate queryset if object in ManyToManyField

我正在嘗試建立一個小型社交網絡,用戶可以在其中喜歡帖子。 我正在使用 Django 3.1.7。 我為帖子定義了我的 model,如下所示:

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM