Я обновился с Django 1.11 до Django 2.0, и мои тесты начали проваливаться.У меня есть 7 TestCase
классов, и все используют setUpTestData
, предоставленные Django.Когда я запускаю их все вместе, один из них не устанавливается из-за 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()
on 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