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>