Попытка добавить новую модель и поле к существующим данным в 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.

Вернуться на верх