9

我最近在我的代码中犯了一个错字,并注意到我得到了相同的行为,所以我想知道 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 列表时,我发现其中包含完全相同的元素。有人对这里发生的事情有一些了解吗?

4

3 回答 3

12

这两个领域恰好都存在。

foreign_key_id是对象上自动创建的列MyModel,而外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. 
于 2013-02-18T21:06:50.840 回答
1

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

于 2013-02-18T21:07:33.607 回答
1

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

>>> print(MyModel.objects.filter(foreign_key_id=var).query)
>>> print(MyModel.objects.filter(foreign_key__id=var).query)

由于underscoredouble_underscore是内存中的独立对象,我相信这就是underscore == double_underscore返回 False 的原因。

于 2019-08-30T16:11:42.337 回答