Django查询单下划线表现得像双下划线?

时间:2013-02-18 21:04:19

标签: python mysql django django-models django-queryset

我最近在我的代码中输入了一个拼写错误并注意到我有相同的行为,所以我想知道django查询中单下划线和双下划线之间有什么区别。

>>> underscore = MyModel.objects.filter(foreign_key_id=var)
>>> double_underscore =  MyModel.objects.filter(foreign_key__id=var)
>>> underscore == double_underscore
False
>>> list(underscore) == list(double_underscore)
True

我不确定使用什么相等的方法来比较查询集,但是当我转换为python列表时,我发现其中包含完全相同的元素。有没有人对这里发生的事情有所了解?

3 个答案:

答案 0 :(得分:8)

这两个领域恰好都存在。

foreign_key_idMyModel对象上自动创建的列,而foreign_key__id是外键表本身的ID。

这些值都是相同的......

MyModel1.foreign_key_id == 5  # this is stored on the model
                              # and does not require a lookup.
MyModel1.foreign_key.id == 5  # this is stored on the target table
                              # and requires a DB hit. 

答案 1 :(得分:1)

foreign_key_id是(隐藏)字段名称MyModelforeign_key__id是对foreign_key字段引用的任何模型上的字段的引用。换句话说,它是外键字段的具体细节。

答案 2 :(得分:0)

根据我的观察,如果仅过滤或获取arg2,Django就足够聪明,不会与ForeignKey进行联接。您可以使用以下方法进行测试:

foreign_key__id

由于>>> print(MyModel.objects.filter(foreign_key_id=var).query) >>> print(MyModel.objects.filter(foreign_key__id=var).query) underscore是内存中的独立对象,因此我相信这就是double_underscore返回False的原因。