我是Django的新手,并且存在模型继承问题。
我的模特:
class Interaction(models.Model):
nom = models.CharField(max_length=128, unique=True)
lieu = models.ForeignKey(Lieu, on_delete=models.CASCADE, blank=True, null=True)
description = models.TextField(default='...')
acces_libre = models.BooleanField(default=True)
class Heros(Interaction):
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True,null=True)
############# Attributs ##########
corps = models.IntegerField(default=0)
coeur = models.IntegerField(default=0)
esprit = models.IntegerField(default=0)
def __str__(self):
return self.nom
class Personnage(Interaction):
# Attributs
corps = models.IntegerField(default=50)
coeur = models.IntegerField(default=50)
esprit = models.IntegerField(default=50)
def __str__(self):
return self.nom
我的迁移:
migrations.CreateModel(
name='Interaction',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nom', models.CharField(max_length=128, unique=True)),
('description', models.TextField(default='...')),
('acces_libre', models.BooleanField(default=True)),
],
),
migrations.CreateModel(
name='Heros',
fields=[
('interaction_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='aventures.Interaction')),
('corps', models.IntegerField(default=0)),
('coeur', models.IntegerField(default=0)),
('esprit', models.IntegerField(default=0)),
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
bases=('aventures.interaction',),
),
migrations.CreateModel(
name='Personnage',
fields=[
('interaction_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='aventures.Interaction')),
('corps', models.IntegerField(default=50)),
('coeur', models.IntegerField(default=50)),
('esprit', models.IntegerField(default=50)),
],
bases=('aventures.interaction',),
),
migrations.AddField(
model_name='interaction',
name='lieu',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='aventures.Lieu'),
),
如果我尝试在django admin中创建一个英雄,我会:
no such column: aventures_heros.interaction_ptr_id
如果我尝试创建一个Personnage:
no such table: aventures_personnage
我试图删除我的迁移,但没有成功。 我确实从旧模型中删除了所有旧实例,但它也无法正常工作... 我不理解为什么它不起作用可以帮助我吗?
谢谢:)
答案 0 :(得分:0)
您似乎正在尝试共享字段,而不必在模型中重复它们。在这种情况下,强烈建议避免 具体继承,而使用抽象继承。
您可以像这样简单地完成此操作:
class Interaction(models.Model):
nom = models.CharField(max_length=128, unique=True)
lieu = models.ForeignKey(Lieu, on_delete=models.CASCADE, blank=True, null=True)
description = models.TextField(default='...')
acces_libre = models.BooleanField(default=True)
class Meta:
abstract = True
完成此操作后,您可以运行makemigrations
和migrate
使其生效
https://docs.djangoproject.com/en/3.0/topics/db/models/#abstract-base-classes