IntegrityError с Django-полиморфным пакетом и serialized_rollback, включенным для TransactionTestCase - PullRequest
0 голосов
/ 13 марта 2019

Надеюсь, что кто-то может указать мне правильное направление с помощью этой комбинации миграций данных 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' для создания из сериализованных данных, и он пытается создать дочерний класс.

...