我创建了一个简单的Django模型来探索F字段,但可以遍历该字段。
class PostgreSQLModel(models.Model):
class Meta:
abstract = True
required_db_vendor = 'postgresql'
class NullableIntegerArrayModel(PostgreSQLModel):
field = ArrayField(models.IntegerField(), blank=True, null=True)
现在,从我的django shell我创建了一个F对象,如下所示。不确定该对象包含的内容。它包含所有ID吗?我如何迭代结果?
>>> a=F('id')
>>> a
F(id)
>>> dir(a)
['ADD', 'BITAND', 'BITOR', 'DIV', 'MOD', 'MUL', 'POW', 'SUB', '__add__', '__and__', '__class__', '__delattr__', '__dict__', '__dir__', '__div__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__mod__', '__module__', '__mul__', '__ne__', '__new__', '__or__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__weakref__', '_combine', 'asc', 'bitand', 'bitor', 'desc', 'name', 'resolve_expression']
答案 0 :(得分:3)
F不是一个字段。
F()对象表示模型字段或带注释列的值。它可以引用模型字段值并使用它们执行数据库操作,而无需将它们从数据库中拉出到Python内存中。 - F() expressions
总之,只要您需要在查询中引用其他字段的值,就可以使用F()
个对象。 F()
对象本身并不代表任何东西。它们用于引用同一查询集上的字段值。
例如(一个非常简单的示例),在您的模型中,如果要查询field
值为其id
两倍的对象,则需要在过滤时reference id
field's value,所以你可以这样使用F()
:
NullableIntegerArrayModel.objects.filter(field=F('id') *2)
F('id')
只是引用该模型的id
值。 Django使用它来创建相应的SQL语句。在这种情况下,这样的事情:
'SELECT "app_model"."id", "app_model"."field" FROM "app_model"
WHERE "app_model"."field" = (("app_model"."id" * 2))'
如果没有F()
表达式,您可以编写原始SQL或在Python中进行过滤(这会降低性能,尤其是在有大量对象时)。
参考文献:
来自F()
班级定义:
能够解析对现有查询对象的引用的对象。 - F source