Функции под классом модели django

Я работаю над моделями django. На уровне проектирования я запутался, могу ли я реализовать функции внутри класса модели. Если могу, то какие функции должны быть внутри, а какие нет. Я не смог найти документа по этому поводу, кроме doc

Или есть какой-нибудь документ, где я могу узнать об этом?

Да, конечно, вы можете создавать функции внутри класса модели. Это очень рекомендуется, особенно для вещей, которые нужно вычислить специально для объектов этой модели. Например, лучше иметь функцию, которая вычисляет, скажем, Reservation время. Вам не нужно помещать эту информацию в базу данных, просто вычисляйте только тогда, когда это необходимо:

class Reservation(models.Model):
    valid_to = models.DateTimeField(...)

    def is_valid(self):
        return timezone.now() < self.valid_to

В зависимости от того, что вам на самом деле нужно/предпочтительно, это может быть с @property декоратором.

Наверное, вы спрашиваете о старой дискуссии "Куда девать бизнес-логику в проекте django? В представления или в модель?"

Я предпочитаю писать бизнес-логику внутри представлений. Но если случается, что мне нужно особое "обращение" с моделью несколько раз в нескольких представлениях, я обращаюсь к ней внутри модели.

Приведу пример:

# models.py
class Customer(models.Model):
    name = models.CharField(max_length=50, verbose_name='Name')


# views.py
def index(request):
    customer = Customer.objects.all().first()
    name = str.upper(customer.name)  # if you need that logic once or twice, put it inside of the view
    return HttpResponse(f"{name} is best customer.")

Если вам нужна логика в нескольких представлениях, снова и снова, поместите ее внутрь вашей модели

# models.py
class Customer(models.Model):
    name = models.CharField(max_length=50, verbose_name='Name')

    @property
    def shouted_name(self):
        return str.upper(self.name)

# views.py
def index(request):
    customer = Customer.objects.all().first()  # grab a customer
    return HttpResponse(f"{customer.shouted_name} is best customer.")

def some_other_view(request):
    customer = Customer.objects.all().first()  # grab a customer
    customer_other = Customer.objects.all().last()  # grab other customer
    return HttpResponse(f"{customer.shouted_name} yells at {customer_other}")
# see method shouted_name executed in two views independently
Вернуться на верх