Почему переменная выдает ошибку TypeError, а функция - нет?

Я пытаюсь выполнить следующий код, но "full_name" выдает мне следующую ошибку.

TypeError: неподдерживаемый тип(ы) операнда для +: 'CharField' и 'str'

from django.db import models

class user(models.Model):
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)

    full_name = first_name + ' ' + last_name

    def __str__(self):
        return self.full_name

Когда я меняю "full_name" с переменной на функцию, ошибка TypeError исчезает и мой код работает нормально.

from django.db import models

class user(models.Model):
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    
    def full_name(self):
        return self.first_name + ' ' + self.last_name

    def __str__(self):
        return self.full_name()

Почему переменная выдает ошибку TypeError, а функция - нет? Разве они не делают одно и то же?

Выдает ошибку, потому что full_name на самом деле является переменной в классе пользователя. Но функция fucntion возвращает строку. Класс user никогда фактически не запускается, поэтому вы не можете определить переменную, которая не является подклассом django.models.

Утверждения на уровне класса оцениваются при запуске. Утверждения в методах оцениваются при вызове метода.

В первом примере выражение оценивается при запуске; относительно значений атрибутов класса. Эффективно, вы делаете models.CharField(max_length=200) + ' ' + models.CharField(max_length=200), но вы не можете конкатенировать CharField со строкой.

Во втором примере выражение выполняется, когда метод вызывается на экземпляре; против значений обоих полей, которые являются строками.

Вернуться на верх