Как установить поле, не относящееся к базе данных, в модели в django
я хочу установить / обновить вычисляемое поле на модели, с различным значением на каждом объекте.
Например, у меня есть модель User
, и я хочу установить свойство name
для каждого пользователя, где name
не является столбцом в БД и не может быть отредактирован пользователем.
имена могут происходить из get_all_users_names()
или из get_name_by_user_id(id)
.
где я должен установить его и как я должен установить его? Я новичок в python, поэтому, пожалуйста, поделитесь кодом :) спасибо
У вас есть несколько вариантов:
Храните
full_name
в базе данных, но не задавайте его в форме или в админке, вы можете использоватьpost_save
сигнал для обновления поля на основе полейfirst_name
иlast_name
. Вы сможете легко фильтровать и выполнять другие действия в БД с этим столбцом, но вам может понадобиться скрыть поле в нескольких областях, чтобы оно не было редактируемым.Используйте метод Model для генерации полного имени, затем вы можете получить доступ к нему в ваших представлениях и шаблоне - однако вы не сможете выполнять фильтрацию или другие действия с БД:
class MyModel(models.Model):
...
@property
def full_name(self):
return f'{self.first_name} {self.last_name}'
- Лучшим вариантом является аннотирование вашего набора запросов полным именем, которое конкатенирует поле first_name и last_name - вы можете отфильтровать аннотацию и вызвать ее в ваших шаблонах и представлениях очень легко.
from django.db.models.functions import Concat, Value
User.objects.annotate(
name=Concat('first_name', V(' '), 'last_name'),
output_field=CharField())
)