Есть опечатка BooleanField, запись в БД внутри getter, лишние count-запросы и риск переполнения payment_agent. Определение провайдера лучше выполнять при подтверждении платежа.
Ошибки в реализации PaymentAgent
Есть опечатка BooleanField, запись в БД внутри getter, лишние count-запросы и риск переполнения payment_agent. Определение провайдера лучше выполнять при подтверждении платежа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В чем заключаются недостатки приведённого кода?
class Payment(models.Model):
is_paid = models.BoolcanField(default=False)
payment_agent = models.CharField(max_length=30)
# ЧЕРТ ВОЗЬМИ?!
def get_payment_agent(self):
"""
Монки-патч для получения агента платежа. Сейчас он хранится в специальном поле в базе данных. Этот метод устарел и
... устарел:: r574
"""
if not self.is_paid:
return "-"
if self.payment_agent:
return self.payment_agent
if self.provider1.filter(type=1).count():
self.payment_agent = "Provider1"
elif self.qprovider2.filter(type=1).count():
self.payment_agent = "A0 Provider2"
elif self.provider3.filter(type=1).count():
self.payment_agent = "Provider3"
elif self.provider4.count():
self.payment_agent = "Complex Provider 4 Name With Surname"
else:
self.payment_agent = "Provider5 Full Company -Name"
self.save()
return self.payment_agent
Ответ
Есть опечатка BooleanField, запись в БД внутри getter, лишние count-запросы и риск переполнения payment_agent. Определение провайдера лучше выполнять при подтверждении платежа.
models.BoolcanField не существует. Длинное имя Complex Provider 4 Name With Surname превышает max_length=30. В показанном фрагменте функция также находится вне класса, а сам механизм monkey-patch не приведён.
Для проверки наличия записей используйте exists, не count. Getter не должен неожиданно выполнять несколько запросов и save, особенно при массовом отображении. Сохраняйте стабильный код провайдера при создании/подтверждении платежа, а отображаемое название берите из справочника.
Fallback на Provider5 не доказывает, что платёж действительно проведён им; отсутствие данных должно быть явным состоянием. Исторические записи заполняйте отдельной контролируемой миграцией, а не при каждом чтении.