Джанго унаследовал модели внешнего ключа столкновения - PullRequest
0 голосов
/ 10 января 2019

Я делаю сайт вопросов и ответов, такой как stackoverflow. Но у модели Django полевые столкновения. Я использую Django2.1.5

Я пытался добавить related_name = 'answers_case', но ничего не изменилось.

Вот мои модели:

class Post(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 Case(Post):
    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)

И ошибка:

Необработанное исключение в потоке, запущенном .wrapper в 0x7fa57c42c7b8> Traceback (последний вызов был последним): Файл "/home/emre/anaconda3/lib/python3.6/site-packages/django/utils/autoreload.py", строка 225, в оболочке fn (* args, ** kwargs) Файл "/home/emre/anaconda3/lib/python3.6/site-packages/django/core/management/commands/runserver.py", строка 117, в inner_run self.check (display_num_errors = True) Файл "/home/emre/anaconda3/lib/python3.6/site-packages/django/core/management/base.py", строка 425, в проверке поднять SystemCheckError (msg) django.core.management.base.SystemCheckError: SystemCheckError: Проверка системы выявила некоторые проблемы:

ОШИБКА: medicus_website.Answer.case: (models.E006) Поле 'case' конфликтует с полем 'case' из модели 'medicus_website.post'.

Проверка системы выявила 1 проблему (0 отключено).

1 Ответ

0 голосов
/ 10 января 2019

Вы попали в ловушку наследования моделей в 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) 
...