Django中Modelobject.id与Modelobject_id的区别是什么?
Django中模型实例的
id与xxx_id属性区别 Modelobject.id:模型自身的主键属性
这是Django给所有模型默认生成的主键属性(未自定义主键的前提下),等价于Modelobject.pk,返回的是主键对应的Python数据类型(比如整数),直接对应数据库表的主键字段值。Modelobject_id:外键字段的原始主键值属性
这个属性只在模型包含外键字段时存在,比如你的模型有个外键字段author,那么对应的author_id就是存储在数据库里的该外键的主键值(整数)。它不需要触发额外的数据库查询就能拿到,而author属性则会返回关联的模型实例(首次访问会查询数据库)。
为什么你会觉得两者表现一致?
大概率是测试场景的巧合:比如你可能误把某个外键的xxx_id和模型自身的id搞混了,或者刚好两者的数值相同。但本质上,id是模型自己的主键,而xxx_id是外键对应的原始值,只有当模型有对应外键时才会存在这个后缀属性。
举个实际代码例子:
from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE)
- 拿
Book实例my_book来说:my_book.id→ 是Book表自身的主键值my_book.author_id→ 直接返回关联Author的主键整数,不用查库my_book.author→ 返回关联的Author实例,首次访问会触发数据库查询
而对于Author实例my_author,只有my_author.id,不存在my_author.author_id,除非你把Author的主键字段特意命名为author_id。
内容的提问来源于stack exchange,提问作者Naveen Kumar R V
相关产品推荐
相关产品推荐

