Попытка добавить новую модель и поле к существующим данным в Django
Я изучаю Django и делаю своего рода социальную сеть и пытаюсь добавить модель и поле к моим моделям. Следующий пост прекрасно объясняет то, что я пытаюсь сделать...
Django - представление беседы в личных сообщениях
Я пытаюсь добавить модель и поле после того, как у меня уже есть несколько сохраненных сообщений. Пока я делаю это в учебных целях, поэтому удаление существующих сообщений и начало работы заново, вероятно, решит проблему, но я пытаюсь научиться ориентироваться в этом, потому что в следующий раз у меня могут быть реальные пользователи и удаление сообщений может оказаться невозможным.
Вот мои модели:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
city = models.CharField(max_length=60)
country = models.CharField(max_length=60)
skillstolearn = models.CharField(max_length=200)
skillstoteach = models.CharField(max_length=200)
description = models.TextField()
def __str__(self):
return self.user.username
class Conversation(models.Model):
participants = models.ManyToManyField(User)
def __str__(self):
return self.participants
class Message(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiver')
content = models.TextField()
conversation = models.ForeignKey(Conversation, default=None, on_delete=models.CASCADE)
timestamp = models.DateTimeField()
def __str__(self):
return self.sender.username + ' to ' + self.receiver.username
Перед попыткой выполнения текущей миграции в файле не было ни модели Conversation, ни поля conversation в модели Message.
Когда я пытаюсь мигрировать, я получаю:
django.db.utils.IntegrityError: NOT NULL constraint failed: new__thecode_message.conversation_id
Как мне заставить это работать и как поступить, если мне нужно изменить модель, поле и т.д. после того, как уже есть пользователи?
Если вы добавляете новое поле в модель, вы не можете попросить заполнить существующие объекты значением None, когда вы не принимаете значения None. Добавьте null=True к полю conversation:
class Message(models.Model):
...
conversation = models.ForeignKey(Conversation, default=None, on_delete=models.CASCADE, null=True)
...
затем makemigrations и migrate. Это должно сработать. Если нет, просто удалите возможно последний файл миграции (с включенным полем) в папке migrations.