如何在django中给出外键名称

eac*_*one 6 python django

我建立了一个名为bbs的模型,引用了User表.

class Bbs_User(models.Model):
    sid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=45)
    #...

class Bbs(models.Model):
    sid = models.AutoField(primary_key=True)
    writer  = models.ForeignKey(Bbs_User)
    title = models.CharField(max_length=80)
    content = models.TextField()

    class Meta:
        db_table = 'Bbs'

    def __str__(self)
        return self.title
Run Code Online (Sandbox Code Playgroud)

在mysql客户端中,我已经研究了Bbs表的布局.

mysql> desc Bbs
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+ 
| sid         | int(11)      | NO   | PRI | NULL    | auto_increment |
| writer_id   | int(11)      | NO   | MUL | NULL    |                |
Run Code Online (Sandbox Code Playgroud)

此时,我想知道为什么字段名称是'writer_id'.
我认为字段名称必须是'writer_sid'或'writer'.

我该如何解决?

ozg*_*gur 9

默认情况下,Django通过附加_id到您在模型中定义的字段名称来填充列的名称.您必须使用db_columnproperty 显式指定列的名称 ,如下所示:

writer = models.ForeignKey(Bbs_User, db_column='writer_sid')
Run Code Online (Sandbox Code Playgroud)


Pab*_*noz 7

框架会自动以这种方式命名外键,但您可以db_column在声明字段时使用参数更改列的名称:

myKey = models.ForeignKey('MyRelatedModel', db_column='my_column_name')
Run Code Online (Sandbox Code Playgroud)

更新:我应该提到自动命名在进行查询时有一些优点:如果你调用myBbsInstance.writer.id你会得到一个你需要解析的 RelatedManager 实例,点击数据库,只获取 id,而调用myBbsInstance.writer_id只返回插入到列,没有数据库命中。它非常好记。