Как установить поле, не относящееся к базе данных, в модели в django

я хочу установить / обновить вычисляемое поле на модели, с различным значением на каждом объекте.

Например, у меня есть модель User, и я хочу установить свойство name для каждого пользователя, где name не является столбцом в БД и не может быть отредактирован пользователем.

имена могут происходить из get_all_users_names() или из get_name_by_user_id(id).

где я должен установить его и как я должен установить его? Я новичок в python, поэтому, пожалуйста, поделитесь кодом :) спасибо

У вас есть несколько вариантов:

  1. Храните full_name в базе данных, но не задавайте его в форме или в админке, вы можете использовать post_save сигнал для обновления поля на основе полей first_name и last_name. Вы сможете легко фильтровать и выполнять другие действия в БД с этим столбцом, но вам может понадобиться скрыть поле в нескольких областях, чтобы оно не было редактируемым.

  2. Используйте метод Model для генерации полного имени, затем вы можете получить доступ к нему в ваших представлениях и шаблоне - однако вы не сможете выполнять фильтрацию или другие действия с БД:

class MyModel(models.Model):
   ...

   @property
   def full_name(self):
       return f'{self.first_name} {self.last_name}'
  1. Лучшим вариантом является аннотирование вашего набора запросов полным именем, которое конкатенирует поле 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())
)
Вернуться на верх