Почему я не могу создать унаследованную модель? - PullRequest
0 голосов
/ 02 мая 2020

Я новичок ie в 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

Если я пытаюсь создать Персонал:

no such table: aventures_personnage

Я пытался удалить свои миграции, но это не помогло т работа. Я удалил весь свой старый экземпляр из моих старых моделей, он тоже не работал ... Я не понимаю, почему он не работает, может ли кто-то мне помочь?

Спасибо :))

1 Ответ

0 голосов
/ 02 мая 2020

Похоже, вы пытаетесь поделиться полями без необходимости повторять их в вашей модели. В этом случае настоятельно рекомендуется избегать бетона наследования и вместо этого использовать abstract наследования.

Вы можете сделать это просто так :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...