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

Mar*_*ark 8 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')
Run Code Online (Sandbox Code Playgroud)

还有一个由查询参数过滤的查询集:

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:
    ???
Run Code Online (Sandbox Code Playgroud)

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

Seb*_*zny 8

根据文档

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

这个答案它遵循你的代码将是:

if user:
    qs = qs.filter(user=user)
if active:
    qs = qs.filter(active=active)
if has_comments:
    qs = qs.filter(comment__isnull=False)
Run Code Online (Sandbox Code Playgroud)

关于性能,请考虑以下答案

Django 不支持用于反向外键查找的 select_related() 方法,因此最好不要离开 Python 进行两次数据库查询。

您还应该看看prefetch_related哪个可以,与select_related反向查找不同ForeignKeys,尽管对查询集的每个元素都有一个单独的查询。

  • 谢谢!```qs.filter(post_comments__isnull=False)``` 有效。在文档中对此进行更多解释会很好。 (2认同)