【问题标题】:Django ForeignKey field typeDjango ForeignKey 字段类型
【发布时间】: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

标签: python mysql django django-models


【解决方案1】:

如果是这样的话:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 2016-06-30
    • 1970-01-01
    • 2017-12-15
    • 2020-08-02
    • 2021-07-13
    • 1970-01-01
    • 2021-04-20
    • 2014-07-19
    相关资源
    最近更新 更多