簡體   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