繁体   English   中英

Django model 字段与其他不存在的 model 字段冲突?

[英]Django model field clashes with other model field that doesn't exist?

我收到此错误:

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

如您所见,我有两个模型,其中一个继承自另一个。 有问题的错误与 CustomPokemon 中的poke_id字段CustomPokemon 我认为这可能是由 inheritance 引起的一些奇怪的冲突,但是如果我将字段名称更改为pokemon_id ,问题就解决了。

虽然这样的解决方法可以让我的代码运行,但我很好奇这里的基本原理是什么; 为什么添加这三个字母后运行完全相同的代码?

related_name=…参数 [Django-doc]反向关系的名称。 因此它访问给定Pokemon的相关CustomPokemon对象。 因此,这意味着Pokemon有一个“隐含字段”,如果你想要的话,这里命名为poke_id 由于CustomPokemon继承自Pokemon ,现在有两个poke_id字段,因此发生了冲突。

然而,指定related_name='poke_id'. You can for example use related_name='poke_id'. You can for example use custompokemons` 代替:

class CustomPokemon(Pokemon):
    poke_id = models.ForeignKey(
        Pokemon,
        on_delete=models.CASCADE, 
        related_name='custompokemons',
        verbose_name='Pokemon ID'
    )
    # …

注意:通常不会将后缀_id添加到ForeignKey字段,因为 Django 会自动添加带有_id后缀的“twin”字段。 因此它应该是pokemon ,而不是poke_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM