更新到Django 2.0后,TestCase中的IntegrityError运行

时间:2018-12-31 14:05:17

标签: django postgresql django-2.1

我从Django 1.11升级到Django 2.0,我的测试开始失败。我有7个TestCase类,都使用Django提供的setUpTestData。当我一起运行它们时,其中一个由于psycopg2.IntegrityError: duplicate key value violates unique constraint "doctors_doctor_pkey"而无法设置。

当我仅运行那些TestCase类之一时,它就可以正常工作。似乎他们在某种程度上互相影响,但是奇怪的是,在升级到Django 2.0之后,它会失败。我还注意到它不在create()处,而在save()处。

dashboards应用的设置中,我有一些创建数据:

cls.d1 = doctor_models.Doctor.objects.create(email="johndoe@example.com", name="John Doe",
                                                 specialization=cls.s1, premium=True,
                                                 premium_price=4310, consultation_price=341)

...
cls.b1 = doctor_models.DoctorBooking.objects.create(clinic=cls.c1, doctor=cls.d1,
                                                            status=2, premium_booking=True,
                                                            patient_name="example",
                                                            patient_phone_number="+9747721234",
                                                            confirmed_date=datetime.strptime(
                                                                "16 Jun 2017 14:22:26:000 +0300",
                                                                receive_format),
                                                            handled_on=datetime.strptime(
                                                                "17 Jun 2017 14:22:26:000 +0300",
                                                                receive_format))

上面第二行将调用save()函数,该函数将在save()上调用cls.d1

def save(self, *args, **kwargs):
    if self.doctor.premium:
        self.premium_booking = True
    else:
        self.premium_booking = False
    super(DoctorBooking, self).save(*args, **kwargs)
    self.doctor.save()  # <- here it raises an IntegrityError

这是我可以提取的最简单的代码,但这对于不同的类都是这样。

要重申这一点,我可以获得以下内容。

psycopg2.IntegrityError: duplicate key value violates unique constraint "doctors_doctor_pkey"
DETAIL:  Key (id)=(7) already exists.

我什至不知道为什么会这样。创建对象时,psycopg2是否不应该自动增加pk?据我所知,当我在.save()之前添加断点并检查数据库中具有相同数据的医生并且pk已在数据库中时,数据库没有任何问题。因此,我猜测这是假定这两个对象是不同的...但是我叫创建然后保存不创建两次。

编辑:已在评论中解决:D

1 个答案:

答案 0 :(得分:1)

很有可能,所引用的doctor已保存。在尝试重新保存之前进行检查。

类似这样的东西:

def save(self, *args, **kwargs):
    if self.doctor.premium:
        self.premium_booking = True
    else:
        self.premium_booking = False

    super(DoctorBooking, self).save(*args, **kwargs)

    if not self.doctor.pk:
        self.doctor.save()