【问题标题】:How to fix migration model 'id' field in Django 2.2?如何修复 Django 2.2 中的迁移模型“id”字段?
【发布时间】:2019-09-29 11:32:21
【问题描述】:

我有一个 Django 模型,它不包含“id”字段,但在我之前迁移的 MySQL 实例中,由于某种原因,它显示了一个“id”字段。我一直收到一条错误消息:

You are trying to add a non-nullable field 'id' to discussions without a default; we can't do that (the database n
eeds something to populate existing rows).

所以我去检查了我的models.py 文件,其中没有“id”字段:

class Discussions(models.Model):

    #team_id = models.ForeignKey(Teams, null=True, on_delete=models.CASCADE)
    login = models.CharField(max_length=30, null=True)
    uid = models.PositiveIntegerField(primary_key=True)
    title = models.CharField(max_length=30, null=True)
    body = models.CharField(max_length=500, null=True)
    comments = models.CharField(max_length=30, null=True)
    updated_at = models.CharField(max_length=21, null=True)

但它出现在我的 MySQL describe 语句中:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| login      | varchar(30)  | YES  |     | NULL    |                |
| comments   | varchar(30)  | YES  |     | NULL    |                |
| updated_at | varchar(21)  | YES  |     | NULL    |                |
| body       | varchar(500) | YES  |     | NULL    |                |
| title      | varchar(30)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

当我删除表以尝试重新同步数据库时,我收到一条错误消息:

django.db.utils.ProgrammingError: (1146, "Table 'my_project.app_discussions' doesn't exist")

理想情况下,我希望通过某种方式让我的uid 变量在我的视图中实际加载到我的数据库实例中,其中id 字段正在被表示。

        # tree->tuples->list of tuples
        json_tree = objectpath.Tree(data)
        login = tuple(json_tree.execute("$..login"))
        uid = tuple(json_tree.execute("$..id"))
        title = tuple(json_tree.execute("$..title"))
        body = tuple(json_tree.execute("$..body"))
        comments = tuple(json_tree.execute("$..comments_count"))
        updated_at = tuple(json_tree.execute("$..updated_at"))

        # took out `uid`
        parsed_list = list(zip(login, uid, title, body, comments, updated_at))

        # LOADING PHASE
        load_data = []

        # took out `u`
        for l, t, i, b, c, u in zip(login, uid, title, body, comments, updated_at):

            load_data.append(Discussions(l, t, i, b, c, u))

        Discussions.objects.bulk_create(load_data)

为什么我无法将这个新架构迁移到 MySQL?为什么这个 uid 字段在我之前没有通过 ORM 映射到 ID 字段中?感谢您的帮助。

【问题讨论】:

    标签: python django django-models orm django-migrations


    【解决方案1】:

    id 是主键,它不能为空。 因为,您在之前的迁移中添加了 id 可为空的字段,那么您需要更改之前的迁移,或者只是在模型中添加新字段并再次运行迁移

    id = models.IntegerField(null=False, primary_key=True)
    

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 1970-01-01
      • 2018-02-20
      • 2023-04-03
      • 2019-06-26
      • 1970-01-01
      • 2022-06-17
      • 2012-12-28
      • 2018-07-14
      相关资源
      最近更新 更多