IntegrityError в TestCase запускается после обновления до Django 2.0 - PullRequest
0 голосов
/ 31 декабря 2018

Я обновился с 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

1 Ответ

0 голосов
/ 31 декабря 2018

Скорее всего, указанный 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()
...