gpt4 book ai didi

python - Django 外键访问是如何工作的

转载 作者:太空狗 更新时间:2023-10-29 19:35:54 25 4
gpt4 key购买 nike

假设我有一个这样的模型。

class Job(models.Model):
client = models.ForeignKey(Contacts, null=True)

假设我有工作 j。我知道我可以像这样访问属于 j 的客户端

 j.client

还有

 j.client_id

所以我的问题是访问 j.client 是如何工作的?

django 是否存储 client__id 然后当调用 j.client 时它会查询以找到正确的对象?

或者对象引用存储到 j 并且访问 client__id 是从 Contact 对象获取 id?

我仔细查看了源代码,但找不到问题的答案

最佳答案

您可能在谈论的是 clientclient_id(单下划线)。

client_id 属性是一个常规(整数)属性。这是保存到数据库中的外键。即使您将 ForeignKey 指定为 client,您也只会在数据库中看到一个 client_id 列。

client 属性是一个对象描述符实例。它是一个覆盖 __get____set__ 方法的特殊类,因此设置和访问该属性会调用该类的方法。这是让您访问实际相关模型实例的魔法。 __get__ 将根据 client_id 属性从数据库中检索正确的模型实例(如果尚未加载)。 __set__ 还会将 client_id 属性设置为相关对象的主键,以便 client_id 始终是最新的。

请注意,此属性在查询查找中也可用,而且非常方便。例如,如果您只有外部对象的主键,而不是模型实例本身,则以下查询看起来非常相似:

job = Job.objects.filter(client__id=pk)
job = Job.objects.filter(client_id=pk)

但是,在第一个查询下面访问相关对象的属性(双下划线)并执行 OUTER JOIN。第二个查询只访问本地属性,因此不必执行 OUTER JOIN 语句并节省性能。

关于python - Django 外键访问是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24892148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com