说我有一个这样的模型。

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?

我已经查看了一下源代码,但是找不到我的问题的答案

最佳答案

在文档中对此进行了解释:
https://docs.djangoproject.com/en/dev/ref/models/fields/#database-representation

在数据库中,只有client_id字段(单个下划线)

在模型实例上,您将具有client属性,当您访问它时,这将导致Django从db加载相关对象并将其实例化为另一个模型实例。

您还将拥有client_id属性(一个下划线),该属性具有相关对象的主键值,存储在db字段中。

在执行ORM查询时,您可以使用client__id(双下划线)语法在相关模型上查找字段,例如,如果client__name模型具有Client字段,则您也可以执行name。这将成为两个模型之间的SQL JOIN查询。

例如

Job.objects.get(client__id=1)
Job.objects.filter(client__name='John')

client = Client.objects.get(pk=1)
Job.objects.get(client=client)

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

10-13 05:04