Django поле модели конфликтует с другим полем модели, которого не существует? - PullRequest
1 голос
/ 06 августа 2020

Я получаю эту ошибку:

ERRORS:
pokollector.CustomPokemon.poke_id: (models.E006) The field 'poke_id' clashes with the field 'poke_id' from model 'pokollector.pokemon'.

Вот соответствующий код:

class Pokemon(models.Model):
    poke_name = models.CharField(max_length=30)
    poke_type = models.ManyToManyField(PokeType)
    evolves_from = False
    evolves_into = False
    gen_added = models.PositiveIntegerField(validators=[min(1), max(gen)])

    class Meta:
        verbose_name_plural = 'Pokemon'

    def __str__(self):
        return self.poke_name


class CustomPokemon(Pokemon):
    #Add name and level for user's specific Pokemon
    poke_id = models.ForeignKey(Pokemon, on_delete=models.CASCADE, 
        related_name='poke_id', verbose_name='Pokemon ID')
    name = models.CharField(max_length=30, blank=True)
    level = models.PositiveIntegerField(blank=True, null=True)
    #add owner attr

    class Meta:
        verbose_name_plural = 'Custom Pokemon'

    def save(self):
        if not self.name:
            self.name = self.poke_name
        super().save()

    def __str__(self):
        return self.name

Как видите, у меня две модели, одна из которых наследуется от другой. . Рассматриваемая ошибка относится к полю poke_id в CustomPokemon. Я подумал, что это может быть какой-то странный конфликт, вызванный наследованием, но если я изменю имя поля на pokemon_id, проблема будет решена.

Хотя такой обходной путь запускает мой код, мне любопытно, что основной принцип здесь; Почему после добавления этих трех букв выполняется один и тот же код?

1 Ответ

1 голос
/ 06 августа 2020

Параметр related_name=… [Django -doc] - это имя отношения в reverse . Таким образом, он обращается к связанным объектам CustomPokemon для данного Pokemon. Таким образом, это означает, что Pokemon имеет «неявное поле», если вы хотите, которое здесь называется poke_id. Поскольку CustomPokemon наследуется от Pokemon, теперь есть два поля poke_id, следовательно, cla sh.

Однако нет особого смысла указывать вместо related_name='poke_id'. You can for example use custompokemons`:

class CustomPokemon(Pokemon):
    poke_id = models.ForeignKey(
        Pokemon,
        on_delete=models.CASCADE, 
        <b>related_name='custompokemons'</b>,
        verbose_name='Pokemon ID'
    )
    # &hellip;

Примечание : Обычно суффикс _id к полю ForeignKey не добавляется, поскольку Django автоматически добавит «двойное» поле с суффиксом _id. Поэтому должно быть pokemon вместо poke_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...