我正在设计一个Django风格的ORM。如果您使用user = models.ForeignKey(User)
,Django会将其转换为user_id
到数据库。
为什么不使用不带_id
后缀的列名?我检查了几个类似的问题,但没有人满意我。
模型字段的名称最好与其数据库列名一致,不是吗?
答案 0 :(得分:2)
在幕后,Django追加" _id"到字段名称以创建其数据库列名称。在上面的示例中,Car模型的数据库表将具有manufacturer_id列。 (您可以通过指定db_column显式更改此值)但是,除非编写自定义SQL,否则您的代码永远不必处理数据库列名。您将始终处理模型对象的字段名称。
为什么呢?可能是因为它会让你不那么容易理解你所看到的列是与不同模型的关系,并且如果你真的要查看数据库表本身(这是很少有必要)
答案 1 :(得分:1)
当您说user = models.ForeignKey(User)
时,您要求Django管理名为user
的模型实例属性。这与存储在数据库中的值不同,后者通常是整数外键,您还需要一种引用方式。
所以你需要两个名字。 Django 可以选择使user
数据库列和user_instance
(或其他)模型实例属性。如果您愿意,请随时在您的ORM中这样做。就个人而言,我更喜欢Django的方式,因为在ORM中处理实例对象更为常见。
答案 2 :(得分:1)
更容易理解,来自此处的文档Automatic primary key fields
默认情况下,Django为每个模型提供以下字段:
id = models.AutoField(primary_key=True)
例如:
class Post(models.Model):
# primary key already here
# other field
post_title = models.CharField(max_length=10, blank=True)
所以当你使用
时post = models.ForeignKey(Post)
当你知道django已经在模型Post中创建了一个id字段时,post_id这里最好连接到Post而不是post。