簡體   English   中英

Django ManyToMany字段過濾器

[英]Django ManyToMany field filter

因此,我有一個這樣的系統,其中我的Post對象具有ManyToMany字段,稱為“保存”。 因此,例如在Reddit上,您可以保存帖子。 因此,它可以正常工作,並且用戶可以保存帖子,並將其添加到ManyToMany字段中。 但是,我想過濾掉這些帖子,只在ManyToMany字段中顯示該用戶所在的帖子。

這是我的models.py

class Post(models.Model):
    author = models.ForeignKey(User,related_name='posts',on_delete=models.CASCADE)
    saves = models.ManyToManyField(User,blank=True,related_name='post_saves')

我將保存字段連接到Django提供的用戶模型。

這是我的views.py

class PostSaveRedirect(RedirectView):
    def get_redirect_url(self,*args,**kwargs):
        pk = self.kwargs.get("pk")
        slug = self.kwargs.get("slug")
        obj = get_object_or_404(Post,pk=pk,slug=slug)
        url_ = obj.get_absolute_url()
        user = self.request.user
        if user.is_authenticated:
            if user in obj.saves.all():
                obj.saves.remove(user)
            else:
                obj.saves.add(user)
        return url_

因此,一切正常,將用戶添加到ManyToMany字段中,但是現在我想知道如何過濾帖子並僅顯示用戶在ManyToMany字段中的帖子。

這是我保存的帖子視圖。

class PostSaveListView(ListView):
    model = Post
    template_name = 'mainapp/post_saved.html'
    paginate_by = 10
    queryset = models.Post.objects.all()

    def get(self,request):
        posts = Post.objects.all()
        return render(request, self.template_name)

    def get_queryset(self):
        return Post.objects.filter().order_by('-published_date')

因此,使用Post.objects.all(),如何更改它,使其能夠滿足我的需求? 這是我有一個用戶帖子列表視圖的類似查詢集

我一直在谷歌搜索並閱讀文檔和其他文章,但沒有發現任何能夠向我展示如何過濾ManyToMany字段的內容。 任何幫助將非常感激

對您來說,最簡單,最快捷的選擇是使用過濾選項如下所示:

 def get_queryset(self):
    return Post.objects.filter(saves__in=[self.request.user]).order_by('-published_date')

請注意用戶對象的列表包含,因為該選項僅從列表中過濾。

您也可以考慮將.distinct()調用也添加到過濾器中,以避免重復對象。

像這樣編輯模型:

    class PostSaveListView(ListView):
        model = Post
        template_name = 'mainapp/post_saved.html'
        paginate_by = 10
    -
        def get(self,request):
            posts = Post.objects.all()
            return render(request, self.template_name)

        def get_queryset(self):
            object_list = Post.objects.filter(saves__in=[self.request.user]).order_by('-published_date').distinct()
            return object_list

暫無
暫無

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

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