Как создать скрытые поля в Django 4/5?

Я использую этот простой пример только для обсуждения:

class User(models.Model):
    first_name = models.CharField(...)        # stored in table
    last_name = models.CharField(...)         # stored in table
    full_name = first_name + ' ' + last_name  # not stored in table

Я хочу, чтобы только full_name было доступно для создания, сохранения, извлечения. Это комбинация имени_и фамилии. Когда полное_имя нужно сохранить, оно будет разделено пробелами, и первая часть попадет в first_name, а остальные - в last_name. Я не хочу, чтобы first_name и last_name были напрямую доступны из форм или даже команд Django, которые могут напрямую использовать методы User instantantiation, ModelModel manager create или User save.

Нужно ли мне взламывать Метакласс (как здесь: https://github.com/vitaly-efremov/django-private-field/blob/master/private_field_meta.py, код 7-летней давности), или есть что-то более простое в Django 4/5?

Я полагаю, что вы говорите о @property декораторе.

class User(models.Model):
    first_name = models.CharField(...)        # stored in table
    last_name = models.CharField(...)         # stored in table

    @property
    def full_name(self):                      # not stored in table
        return f'{self.first_name} {self.last_name}'

вы можете вызвать его, используя user_obj.full_name

Что касается генерируемых полей, то в Django 5 это предусмотрено. За более подробной информацией обращайтесь: https://docs.djangoproject.com/en/5.0/releases/5.0/#database-generated-model-field

Вместо:

full_name = **first_name + ' ' + last_name**

Вы можете сделать это следующим образом:

full_name = models.GeneratedField(
            expression=Func(F("first_name"), F("last_name"), function="CONCAT", output_field=CharField()),
            output_field=models.CharField(),
            db_persist=True,
          )
Вернуться на верх