Python 在Django'中只使用'foreign_key=`和'foreign_key_id=`有什么区别吗;什么是ORM?
以下各项之间似乎没有区别:Python 在Django'中只使用'foreign_key=`和'foreign_key_id=`有什么区别吗;什么是ORM?,python,sql,django,orm,Python,Sql,Django,Orm,以下各项之间似乎没有区别: ModelA.objects.filter(modelb_id=a_model_id) ModelA.objects.filter(modelb=a_model_id) 打印出Django为这两种情况生成的SQL表明它是相同的。然而,我在任何地方都找不到正式的文档,因此我担心在某些情况下,仅仅使用modelb可能会导致与modelbu id不同的结果 我特别感兴趣的是有人指派我到官方的来源确认这些事情是等价的。TLDR:最好考虑框架的作者的推荐和使用模型字段名称。
ModelA.objects.filter(modelb_id=a_model_id)
ModelA.objects.filter(modelb=a_model_id)
打印出Django为这两种情况生成的SQL表明它是相同的。然而,我在任何地方都找不到正式的文档,因此我担心在某些情况下,仅仅使用modelb
可能会导致与modelbu id
不同的结果
我特别感兴趣的是有人指派我到官方的来源确认这些事情是等价的。
TLDR:最好考虑框架的作者的推荐和使用模型字段名称。 数据库表示法
在幕后,Django将“_id”附加到字段名以创建其数据库列名。在上面的示例中,车型的数据库表将有一个制造商id列。(您可以通过指定db_column来显式地更改这一点)但是,您的代码不必处理数据库列名,除非您编写自定义SQL。您将始终处理模型对象的字段名 模型字段子类。字段
类有一个attname
字段,用于解析要在模型对象上使用的属性
# A guide to Field parameters:
#
# * name: The name of the field specified in the model.
# * attname: The attribute to use on the model object. This is the same as
# "name", except in the case of ForeignKeys, where "_id" is
# appended.
# * db_column: The db_column specified in the model (or None).
# * column: The database column for this field. This is the same as
# "attname", except if db_column is specified.
#
# Code that introspects values, or does other dynamic things, should use
# attname. For example, this gets the primary key value of object "obj":
#
# getattr(obj, opts.pk.attname)
作为执行流程的一部分,名称被转换为包含相应名称的模型字段的PathInfo
元组
,是以下行:
field = opts.get_field(name)
现在,opts
是缓存属性的一个实例,该方法将委托给\u forward\u fields\u map
或fields\u map
缓存属性
当您查看这两个属性的实现时,您会看到它们返回一个字典映射,映射到field.name
到field
,以及field.attname
到field
这使得modelbu id
或modelb
从任何一个缓存属性解析为model字段
在我看来,将modelbu id
或modelb
作为关键字参数传递给QuerySet.filter
并不重要。只有前一个关键字需要了解实现细节
<>但是最好考虑框架的作者的建议并使用模型字段名。< /P>