为什么我不能创建继承的模型?

时间:2020-05-02 15:45:43

标签: django inheritance model

我是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

我试图删除我的迁移,但没有成功。 我确实从旧模型中删除了所有旧实例,但它也无法正常工作... 我不理解为什么它不起作用可以帮助我吗?

谢谢:)

1 个答案:

答案 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

完成此操作后,您可以运行makemigrationsmigrate使其生效

https://docs.djangoproject.com/en/3.0/topics/db/models/#abstract-base-classes

相关问题