Как исправить поле 'id' модели миграции в Django 2.2? - PullRequest
0 голосов
/ 12 мая 2019

У меня есть модель 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 в поле идентификатора после того, как оно было у меня раньше? Спасибо за любую помощь.

1 Ответ

2 голосов
/ 12 мая 2019

id - это первичный ключ, и он не должен иметь значения NULL. Так как вы добавляете id поле, обнуляемое в предыдущих миграциях, вам нужно изменить предыдущую миграцию или просто добавить новое поле в модель и снова выполнить миграции

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