Несоответствие внешнего ключа Django при выполнении миграций для полиморфных отношений
У меня есть следующие модели в приложении Django:
class Sender(PolymorphicModel):
name = models.CharField(max_length=100)
email = models.EmailField(null=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
class Student(Sender):
group_name = models.CharField(max_length=100, null=True)
class Teacher(Sender):
bio = models.TextField(max_length=255, null=True)
class Connection(models.Model):
student_id = models.ForeignKey('students.Student', null=False, on_delete=models.CASCADE)
teacher_id = models.ForeignKey('teachers.Teacher', null=False, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
class Message(models.Model):
body = models.TextField(max_length=255, null=False)
sender_id = models.ForeignKey('senders.Sender', null=False, on_delete=models.CASCADE)
connection_id = models.ForeignKey('connections.Connection', null=False, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
Модельные классы Teacher и Student наследуются от Sender; я хочу, чтобы Connection имел определенные внешние ключи к Teacher и Student соответственно.
Когда я создаю и запускаю миграции, я получаю django.db.utils.OperationalError: foreign key mismatch - "connections_connection" ссылается на "teachers_teacher"
.
Не могу ли я использовать дочернюю модель, которая наследуется от полиморфной модели, в качестве внешнего ключа для другой модели? Есть ли способ обойти это, или я должен использовать другую парадигму? Спасибо!
Я нашел способ сделать это самостоятельно, удалив полиморфный класс Sender и используя GenericForeignKey
для Message,
но я был бы рад услышать и альтернативные подходы.
class Student(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
group_name = models.CharField(max_length=100, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
class Teacher(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
bio = models.CharField(max_length=100, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
class Connection(models.Model):
student_id = models.ForeignKey('students.Student', null=False, on_delete=models.CASCADE)
teacher_id = models.ForeignKey('teachers.Teacher', null=False, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
class Message(models.Model):
body = models.TextField(max_length=255, null=False)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
sender_id = models.PositiveIntegerField(null=False)
content_sender = GenericForeignKey('content_type', 'sender_id')
connection_id = models.ForeignKey('connections.Connection', null=False, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)