Вы попали в ловушку наследования моделей в django. Вы применяете Многостоловое наследование , в то время как я предполагаю, что вы ожидаете Абстрактное наследование .
Другими словами, у вашего Post
уже есть поле case
- поскольку у вас есть наследование нескольких таблиц от Case
до Post
, каждому Post
может соответствовать Case
, и поэтому вы иметь имя столкновения. Если вы хотите сохранить текущее поведение (с точки зрения структуры БД и построения отношений), вам придется переименовать либо поле Case
модель, либо поле case
в ответе. С другой стороны, если вы хотите переключиться на абстрактное наследование, когда каждая таблица является автономной, вы можете сделать это следующим образом:
class AbstractPost(models.Model):
user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
post_date = models.DateTimeField(auto_now_add=True)
score = models.IntegerField(default=0)
body = models.TextField()
last_edit_date = models.DateTimeField(null=True, blank=True)
is_active = models.BooleanField(default=False)
class Meta:
abstract = True
class Post(AbstractPost):
# if you need standalone posts
pass
class Case(AbstractPost):
title = models.CharField(max_length=150)
slug = models.SlugField(unique=True, max_length=150)
view_count = models.IntegerField(default=0)
keyword = models.ManyToManyField(Keyword)
class Answer(Post):
case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='answers_case')
is_accepted = models.BooleanField(default=False)