Как я могу добавить нового родителя в модель типа содержимого Django

Итак, я написал библиотеку для синхронизации данных на панели администратора Django с ведром s3. Но для этого модели должны наследоваться от BaseSyncModel, которую я создал.

Чтобы обойти это, я создал новую модель под названием BaseContentTypeModel, вот так:

#content_type.app
class BaseContentTypeModel(BaseSyncModel, ContentType):
    pass

class BasePolymorphicModel(PolymorphicModel):

    polymorphic_ctype = models.ForeignKey(
        BaseContentTypeModel,
        null=True,
        editable=False,
        on_delete=models.CASCADE,
        related_name="polymorphic_%(app_label)s.%(class)s_set+",
    )

    class Meta:
        abstract = True

Существует только одна модель, которая наследуется от PolymorphicModel, и она такова:

class Product(BasePolymorphicModel, UUIDModel, PriceModel, AdminWriteMixin):
    """Product generic model."""

    price_old = models.PositiveIntegerField(
        default=0,
        help_text="old price in cents",
    )
    name = models.CharField(
        max_length=128,
    )
    slug = models.SlugField(
        max_length=256,
        unique=True,
    )
    is_active = models.BooleanField(
        default=True,
    )

Но когда я выполнил команду migrate, она выдала следующую ошибку:

django.db.utils.IntegrityError: insert or update on table "product_product" violates foreign 
key constraint "product_product_polymorphic_ctype_id_44f73554_fk_content_t" 
DETAIL: Key (polymorphic_ctype_id)=(8) is not present in table "content_type_basecontenttypemodel".

Я также попытался выполнить функцию forward в файле миграции для копирования каждой строки модели ContentType в BaseContentTypeModel:

def forwards_func(apps, schema_editor):
    old_contenttype = apps.get_model("contenttypes", "ContentType")
    new_contenttype = apps.get_model('content_type', "BaseContentTypeModel")
    db_alias = schema_editor.connection.alias
    old_objects = old_contenttype.objects.using(db_alias).all()
    for object in old_objects:
        nct_obj = new_contenttype(contenttype_ptr_id=object.id)
        nct_obj.save()


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('contenttypes', '0002_remove_content_type_name'),
    ]

    operations = [
        migrations.RunPython(forwards_func, migrations.RunPython.noop)]
Вернуться на верх