2016-09-09 63 views
1

我创建了一个简单的Django模型来探索F字段,但可以迭代该字段。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'] 

回答

2

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()类定义:

一个目的能够解决和借鉴的es到现有的查询对象。 - F source

+0

很棒的答案。如果你不介意,我认为这可以清理并在Django文档部分使用:http://stackoverflow.com/documentation/django/topics –

+0

@ TheBrewmaster肯定没有问题。 –