为什么Django默认将`_id`后缀添加到外键的db列名?

时间:2016-09-08 03:15:03

标签: django

我正在设计一个Django风格的ORM。如果您使用user = models.ForeignKey(User),Django会将其转换为user_id到数据库。

为什么不使用不带_id后缀的列名?我检查了几个类似的问题,但没有人满意我。

模型字段的名称最好与其数据库列名一致,不是吗?

3 个答案:

答案 0 :(得分:2)

来自database representation

的文档
  

在幕后,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。