在Django中通过反向存在检查过滤查询集

时间:2015-06-03 22:56:50

标签: python django

我有模特:

class Post(models.Model):
    content = models.CharField()
    user = models.ForeignKey('users.User')
    active = models.BooleanField(default=True)

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='post_comments')

一个由查询params过滤的查询集:

user = request.QUERY_PARAMS.get('user_id', None)
active = request.QUERY_PARAMS.get('active', None)
has_comments = request.QUERY_PARAMS.get('has_comments', None)

qs = Post.objects.all()

if user:
    qs = qs.filter(user=user)
if active:
    qs = qs.filter(active=active)
if has_comments:
    ???

我不知道如何在维护所有以前的过滤器的同时过滤此查询。有可能吗?

1 个答案:

答案 0 :(得分:3)

根据documentation

  

要引用“反向”关系,只需使用模型的小写名称。

this answer开始,您的代码将是:

if user:
    qs = qs.filter(user=user)
if active:
    qs = qs.filter(active=active)
if has_comments:
    qs = qs.filter(comment__isnull=False)

关于效果,请考虑this answer

  

Django不支持反向外部的select_related()方法   密钥查找,所以你不用离开Python就可以做到最好   数据库查询。

您还应该查看prefetch_related,与select_related不同,它可以跨反向ForeignKeys执行查找,但对查询集的每个元素都有单独的查询。