使用 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 的同意。