Как я могу добавить нового родителя в модель типа содержимого 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)]