我有一个型号产品:
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没有检测到外键的正确字段类型。
答案 0 :(得分:1)
如果发生这种情况:
managed = False
)。Products
创建了初始迁移。然后,您需要删除2)中提到的迁移,然后重新创建它。只有这样,正确的类型才会传递给外键。
请注意,如果PositiveIntegerField具有INT(NOT_10)作为MySQL数据库表示形式,这可能仍然会出错。