[英]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.