Django ManyToMany字段过滤器

时间:2019-11-24 22:36:42

标签: python django django-models django-views

因此,我有一个这样的系统,其中我的Post对象具有ManyToMany字段,称为“保存”。因此,例如在Reddit上,您可以保存帖子。因此,它可以正常工作,并且用户可以保存帖子,并将其添加到ManyToMany字段中。但是,我想过滤掉这些帖子,只在ManyToMany字段中显示该用户所在的帖子。

这是我的模特。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提供的用户模型。

这是我的观点。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(),如何更改它,使其能够满足我的需求?这是我拥有的用户帖子列表视图的类似查询集

我一直在Google阅读并阅读文档和其他文章,但没有发现任何能够向我展示如何过滤ManyToMany字段的内容。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

最简单,最快捷的选择是使用过滤选项 in ,如下所示:

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

请注意 user 对象的列表包含,因为该选项仅从列表中过滤。

您还可以考虑将 .distinct()调用也添加到过滤器中,以避免对象重复。

答案 1 :(得分:1)

像这样编辑模型:

    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
相关问题