Отсутствует соответствующий объект в запросе во время переопределения save () для модели - выдается ошибка DoesNotExist - PullRequest
1 голос
/ 20 июня 2019

Я перезаписываю свою модель save (), чтобы проверить, не существует ли получатель (связанный объект), который уже существует с введенным адресом электронной почты. Когда Потребитель существует с соответствующим Электронным письмом, код выполняется так, как ожидалось, и связывает Случай с правильным Потребителем. Однако, если не существует существующего получателя с соответствующим адресом электронной почты, я получаю сообщение об ошибке: «DoesNotExist: Запрос на совпадение получателя не существует».

Я пытался настроить метод save (), однако для меня это выглядит правильно (очевидно, здесь может быть неправильно).

Models.py

class Case(models.Model):
  ...

  def save(self,*args,**kwargs):

    if Consumer.objects.get(email__iexact=self.email):
        self.consumer = Consumer.objects.get(email__iexact=self.email)

    else:
        consumer = Consumer(first_name=self.first_name,last_name=self.last_name,email=self.email)
        consumer.save()

    return super().save(*args,**kwargs)

Ожидаемый результат - создание нового объекта Consumer в случае, если электронное письмо, введенное в Case, не совпадает с уже существующим электронным письмом Consumer. Вместо этого он выдает эту ошибку.

1 Ответ

1 голос
/ 20 июня 2019

Проблема в том, что ваш:

if Consumer.objects.<b>get(</b>email__iexact=self.email<b>)</b>:
    # ...

вызовет ошибку, если такой Consumer объект не существует или существует несколько объектов.

Однако вы можете просто проверить,такого объекта не существует, и создайте его, если он отсутствует, с единственным .get_or_create(..) [Django-doc] вызовом:

def save(self,*args,**kwargs):
    self.consumer, __ = Consumer.objects.get_or_create(
        email=self.email,
        defaults={'first_name': self.first_name, 'last_name': self.last_name}
    )
    return super().save(*args,**kwargs)

Так в случаедля этого email уже существует Consumer, мы просто извлекаем его, в противном случае мы его создаем и извлекаем.Затем мы устанавливаем ответ на self.consumer и сохраняем объект.

Обратите внимание, однако, что это не очень безопасно: .save(..) может быть отменено, например, в .bulk_create(..) [Джанго-док] .Кроме того, здесь вы делаете копию данных.Если позднее обновите ваш Case объект, он больше не будет синхронизироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...