簡體   English   中英

在Django中通過反向存在檢查過濾查詢集

[英]Filter queryset by reverse exists check in 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')

一個由查詢參數過濾的查詢集:

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:
    ???

我不知道如何在維護所有先前的過濾器的同時過濾此查詢。 可能嗎?

根據文件

要引用“反向”關系,只需使用模型的小寫名稱。

這個答案來看,你的代碼將是:

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

關於性能,請考慮以下答案

Django不支持用於反向外鍵查找的select_related()方法,因此在不離開Python的情況下,您可以做的最好的事情是兩個數據庫查詢。

您還應該看一下prefetch_related ,與select_related不同,它可以跨反向ForeignKeys進行查找,盡管對查詢集的每個元素都有單獨的查詢。

暫無
暫無

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

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