我从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
答案 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()