![](/img/trans.png)
[英]django - prepending a field in the query set that doesn't exist in the 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.