Надеюсь, что кто-то может указать мне правильное направление с помощью этой комбинации миграций данных Django (с созданием полиморфной модели), пакета django-polymorphic и запуска TransactionTestCase с параметром serialized_rollback, установленным в значение True.
Пакеты
- Джанго-Полиморфный 2.0.3
- Джанго 1.11.9
База данных
- MySQL 5.7.21 (таблицы InnoDB)
Issue
Я пытаюсь создать TransactionTestCase с serialized_rollback = True.Однако, когда я запускаю несколько тестов вместе, один тест пройдет, а другой вызовет ошибку IntegrityError.Если я запускаю только один тест, он будет работать нормально.
Ошибка:
(происходит только для тестов после первого)
IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`test_portal`.`packageb_verizonrateplan`, CONSTRAINT `packageb_ve_rateplan_ptr_id_101d57b3_fk_packagea` FOREIGN KEY (`rateplan_ptr_id`) REFERENCES `packagea_rat)')
Файлы
Test.py
class TestBlank(TransactionTestCase):
serialized_rollback = True
def test1(self):
pass
def test2(self):
pass
Test1 пройдет.Test2 вызовет ошибку IntegrityError.Тест 2 пройдёт, если я запусту его в одиночку.
Пакет A / модели
from polymorphic.models import PolymorphicModel
class RatePlan(PolymorphicModel):
name = models.CharField(max_length=255)
subscriber_charge = models.FloatField(null=True)
Пакет B / модели:
from PackageA.models import RatePlan
class VerizonRatePlan(RatePlan):
verizon_plan_code = models.IntegerField(null=False)
… migrations / 0006_populatePricePlans.py
def addNewRatePlans(apps, schema_editor):
VerizonRatePlan = apps.get_model("PackageB", "VerizonRatePlan")
ContentType = apps.get_model("contenttypes", "ContentType")
new_ct = ContentType.objects.get_for_model(VerizonRatePlan)
VerizonRatePlans.objects.create(name="Random Rate Plan", verizon_plan_code=99304, subscriber_charge=100.00, polymorphic_ctype=new_ct)
class Migration(migrations.Migration):
…
operations = [
migrations.RunPython(addNewRatePlans, migrations.RunPython.noop)
]
Я проходил по коду и внутри… \ Django 1.11 \ env \ Lib \ django \ test \ testcases.py ипеременная _test_serialized_contents имела сериализованный VerizonRatePlan, но не имела данных о родительском PackageA / RatePlan.Кроме того, в сериализованных данных было две записи.
Сериализованные данные:
{
"model": "packageb.verizonrateplan",
"pk": 99304,
"fields": {
"verizon_plan_code": 99304
}
},
{
"model": "packageb.verizonrateplan",
"pk": 99304,
"fields": {
"verizon_plan_code": 99304
}
При десериализации объектов в _fixture_setup () в файле testcases.py,Я предполагаю, что получаю IntegrityError, потому что нет родительского объекта 'rateplan' для создания из сериализованных данных, и он пытается создать дочерний класс.