Изменить таблицы и столбцы в Django - PullRequest
1 голос
/ 29 января 2020

Я пытался изменить некоторые поля столбцов в моей таблице MySQL, изменив класс «test» ниже и испортив его, я также удалил файлы миграции.

Я новичок к моделям и миграциям, но я пытаюсь понять, как правильно изменить таблицу или столбцы.

1) Я видел, как люди изменяли тестовый класс напрямую, например, если я хотел бы изменить decimal_places до 5 вместо 4 они просто изменили число и запустили makemigrations. Вот как я это сделал, иногда это работало, а иногда не распознавало никаких изменений. А теперь в последний раз он испортил мою функцию unique_together ().

После некоторых исследований мне кажется, что я должен создать таблицу с классом test (models.Model), а затем оттуда, если я хотел бы изменить что-то, что я должен использовать функцию ALTER TABLE?

2) Поскольку теперь я испортил хорошо функционирующую базу данных, я хотел бы удалить свою таблицу и создать новый models.py и заново выполнить настройку. Это «правильный» способ сделать это или есть что-то более гладкое, чем просто DROP TABLE и удаление models.py и миграций?

# Create your models here.
class test(models.Model):
 birth = models.DateTimeField(blank=True, null=True)
 published = models.CharField(primary_key=True, max_length=50)
 city = models.CharField(max_length=50)
 price = models.DecimalField(max_digits=10, decimal_places=4, null=True)
 something = models.CharField(max_length=5, blank=True, null=True)

class Meta:
    managed = True
    db_table = 'test'
    unique_together = (('published', 'city', 'price'),)

def __str__(self):
    return self.names

Ответы [ 2 ]

1 голос
/ 30 января 2020

Похоже, что ваши проблемы были вызваны вами, добавив unique_together, который включает в себя поле, которое может иметь значения NULL.

price = models.DecimalField(max_digits=10, decimal_places=4, null=True)

Поле price может иметь NULL значения в вашей базе данных, как вы определили null=True.

Ваш unique_together содержит это обнуляемое поле, однако:

unique_together = (('published', 'city', 'price'),)

Скорее всего, вы создали несколько test объектов в вашей базе данных без указания цены. Затем вы создали ограничение unique_together, которое нарушается, поскольку в столбце price несколько записей имеют значение NULL.

Самый простой вариант исправить это, вероятно, это:

  • удалите все свои записи с помощью test.objects.all().delete()
  • запустите миграции (python manage.py migrate), которые теперь будут возможны, поскольку ваше ограничение больше не нарушено
  • , затем создайте записи снова

Вы получите ValidationError при их создании, поскольку ваше ограничение будет снова нарушено. Вам необходимо выяснить, как обрабатывать конфликтующие записи, например, путем изменения одного из значений (published, city или price) или просто не хранить записи, которые вызывают ошибку.

Другой опция заключается в обновлении ваших записей вручную, чтобы удалить любые конфликты. Скорее всего, достаточно добавить цену к каждой записи, чтобы исправить это.

Вы также можете очистить таблицу test до SQL. В этом случае вам также нужно избавиться от записей в таблице django_migrations в вашей базе данных, удалить миграции и снова запустить makemigrations и migrate.

Вы сможете исправить свои проблемы удалив test объекты, запустив migrate и затем создав их снова.

0 голосов
/ 30 января 2020

1) Попробуйте migrate your_app zero, если у вас еще есть таблица и миграции. 2) Удалите файлы миграции. 3) Затем, при необходимости, перепишите модель. 4) makemigrations и migrate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...