Ошибки в реализации PaymentAgent

Есть опечатка BooleanField, запись в БД внутри getter, лишние count-запросы и риск переполнения payment_agent. Определение провайдера лучше выполнять при подтверждении платежа.

Короткий ответ

Что ответить на собеседовании

Есть опечатка 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 не доказывает, что платёж действительно проведён им; отсутствие данных должно быть явным состоянием. Исторические записи заполняйте отдельной контролируемой миграцией, а не при каждом чтении.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее