Как создать скрытые поля в 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,
)