2

我从 Django 1.11 升级到 Django 2.0,我的测试开始失败。我有 7TestCase个类,都使用setUpTestDataDjango 提供的。当我将它们全部一起运行时,其中一个由于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

4

1 回答 1

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()
于 2018-12-31T14:15:30.087 回答