Здесь есть два варианта. Первый - создать метод для динамического поиска, но использовать декоратор property
, чтобы другой код мог по-прежнему использовать прямой доступ к атрибутам.
class MyModel(models.Model):
_first_name = models.CharField(max_length=100, db_column='first_name')
@property
def first_name(self):
return self._first_name or self.user.first_name
@first_name.setter
def first_name(self, value):
self._first_name = value
Это всегда будет относиться к последнему значению first_name, даже если связанный пользователь был изменен. Вы можете получить / установить свойство точно так же, как атрибут: myinstance.first_name = 'daniel'
Другой вариант - переопределить метод save()
модели, чтобы он выполнял поиск при сохранении:
def save(self, *args, **kwargs):
if not self.first_name:
self.first_name = self.user.first_name
# now call the default save() method
super(MyModel, self).save(*args, **kwargs)
Таким образом, вам не нужно менять свою базу данных, но она обновляется только при сохранении - поэтому, если связанный объект User изменяется, но этот объект не изменяется, он ссылается на старое значение User.