Django QuerySet直接访问外键字段,无需强制连接

Ove*_*ked 6 django django-queryset

假设您有一个模型Entry,其中一个字段"author"指向另一个模型Author.假设此字段可以为null.

如果我运行以下QuerySet:

Entry.objects.filter(作者= X)

其中X是某个值.假设在MySQL中我在Entry上为其他一些列和author_id设置了一个复合索引,理想情况下我希望SQL在Entry模型上使用"author_id",这样它就可以使用复合索引.

事实证明,Entry.objects.filter(author = 5)可以工作,没有连接完成.但是,如果我说author = None,Django会与Author进行连接,然后添加到Where子句Author.id IS NULL.所以在这种情况下,它不能使用复合索引.

有没有办法告诉Django只检查pk,而不是按照链接?

我知道的唯一方法是在QuerySet中添加一个额外的.extra(where = ['author_id IS NULL']),但我希望.filter()中的一些魔法可以工作.

谢谢.

(对不起,我之前对此并不清楚,感谢lazerscience和Josh的回答).

Jos*_*ton 1

这不符合预期吗?

Entry.objects.filter(author=X.id)
Run Code Online (Sandbox Code Playgroud)

您可以在外键过滤器中使用模型或模型 ID。我还无法正确检查这是否执行单独的查询,尽管我真的希望它不会。