使用 F 对象进行高级查询

F() 对象表示模型字段或带注释的列的值。它可以引用模型字段值并使用它们执行数据库操作,而无需将它们从数据库中拉出到 Python 内存中。 - F() 表达式

只要需要在查询中引用另一个字段的值,就可以使用 F() 对象。就其本身而言,F() 对象并不意味着什么,并且它们不能也不应该在查询集之外调用。它们用于在同一查询集上引用字段的值。

例如,给定一个模型……

SomeModel(models.Model):
    ...
    some_field = models.IntegerField()

…用户可以通过参考 id 字段的值来查询 some_field 值为 id 的两倍的对象,同时使用 F() 进行过滤,如下所示:

SomeModel.objects.filter(some_field=F('id') * 2)

F('id') 只是引用同一个实例的 id 值。Django 使用它来创建相应的 SQL 语句。在这种情况下,一些非常类似于此:

SELECT * FROM some_app_some_model 
WHERE some_field = ((id * 2))

如果没有 F() 表达式,这将通过原始 SQL 或 Python 中的过滤来实现(这会降低性能,尤其是在有大量对象时)。

参考文献:

F() 类定义:

能够解析对现有查询对象的引用的对象。 - F 源

注意:此示例来自上面列出的答案,并得到 TinyInstance 的同意。