【问题标题】:Django query single underscore behaving like double underscore?Django查询单下划线表现得像双下划线?
【发布时间】:2013-02-03 09:52:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这两个字段恰好同时存在。

    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. 
    

    【讨论】:

    • 这对 objects.filter 调用有何影响?我的猜测是 __id 将使用连接过滤数据库句柄,而 _id 将返回 MyModel 表中的所有对象并在 django 中进行过滤。还是它们都在数据库中进行过滤,但 __id 涉及两个表而 _id 只涉及一个?
    • @blackfedora 你有工具可以查看 SQL 查询
    • 谢谢,使用 .query 进行检查,看起来无论哪种方式都生成了相同的 mysql 查询。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-11-28
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多