Django ForeignKey 字段类型

Posted

技术标签:

【中文标题】Django ForeignKey 字段类型【英文标题】:Django ForeignKey field type 【发布时间】:2018-03-01 05:37:48 【问题描述】:

我有一个模型产品:

class Products(models.Model):
       id = models.PositiveIntegerField(primary_key=True)
       name = models.CharField(max_length=255)
       image = models.CharField(max_length=255, blank=True, null=True)
       status = models.IntegerField()
       """created_by = models.IntegerField(blank=True, null=True)
       updated_by = models.IntegerField(blank=True, null=True)"""

       created_by = models.ForeignKey('User', db_column='created_by', related_name='created_product')
       updated_by = models.ForeignKey('User', db_column='updated_by', related_name='update_product')
       created_at = models.DateTimeField(blank=True, null=True)
       updated_at = models.DateTimeField(blank=True, null=True)

mysql shell 显示类型的 id 字段:

| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |

我正在尝试以这种方式为此表创建一个 ForeignKey:

class ProductVarieties(models.Model):
       id = models.PositiveIntegerField(primary_key=True)
       product = models.ForeignKey(Products)
       variety = models.CharField(max_length=200, blank=True, null=True)
       created_at = models.DateTimeField(blank=True, null=True)
       updated_at = models.DateTimeField(blank=True, null=True)

在运行迁移时,我收到一个错误 django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')

如果我这样做describe product_varieties,我会得到:

+------------+------------------+------+-----+---------+-------+
| Field      | Type             | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| id         | int(10) unsigned | NO   | PRI | NULL    |       |
| variety    | varchar(200)     | YES  |     | NULL    |       |
| created_at | datetime(6)      | YES  |     | NULL    |       |
| updated_at | datetime(6)      | YES  |     | NULL    |       |
| product_id | int(11)          | NO   |     | NULL    |       |
+------------+------------------+------+-----+---------+-------+

product_id 的通知类型显示int(11) 而不是int(10) unsigned

这意味着 django 没有检测到正确的外键字段类型。

【问题讨论】:

你为什么把你的id字段设为PositiveIntegerFields? Django 不会检测到它们是自动增量,因此您将在更新和插入时遇到问题。 那是因为使用models.AutoField 会创建带有int(11) 而不是int(10) unsigned 的主键。我的表中已经有带有int(10) unsigned 的表。我希望能够与他们建立 ForeignKey 关系。 为什么不使用默认 ID?如果您想将 id 用作其他表的键 - 您可以进行迁移,因此任何信息都不会丢失。 伙计们,我认为您没有理解这里的重点。如果我将AutoField 用作主键,则在创建foreign keysint(11) and int(10) unsigned 之间存在类型冲突。 Django 不允许我在创建foreign keys 时指定要使用的字段类型,mysql 不允许我从int(11)int(10) unsigned 创建foreign keys 【参考方案1】:

如果是这样的话:

    您的模型不受管理(元中的managed = False)。 您已为非托管目标模型 Products 创建了初始迁移。 然后您更改了主键类型。 现在您正在尝试创建外键。

然后你需要删除2)中提到的迁移,然后重新创建它。只有这样才能将正确的类型传递给外键。

请注意,如果 PositiveIntegerField 有一个 INT(NOT_10) 作为 MySQL 数据库表示,这可能仍然会出错。

【讨论】:

以上是关于Django ForeignKey 字段类型的主要内容,如果未能解决你的问题,请参考以下文章

模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏

Django 关系类型字段

django关系类型字段

Django Admin 中的 ForeignKey 或 ManyToMany 字段搜索

基于model的form表单

python django models.Model 遍历所有字段