Каковы лучшие практики хранения дублирующихся данных в моделях Django, таких как имя, фамилия и полное имя.
Я создал проект с фронтендом React и API Django Rest Framework (DRF) для бэкенда. Все идет хорошо, но мне очень интересно узнать о лучших практиках сохранения данных для ваших моделей.
В качестве примера, у меня есть модель пользователя с полями first_name
и last_name
. Между моим пользователем и двумя пользовательскими доменами (допустим, Buyer
и Seller
в качестве примера) существует отношение один-к-одному. Кроме того, у нас есть отношение внешнего ключа для Seller
на что-то вроде Product
.
В моем пользовательском интерфейсе есть таблицы, в которых отображаются данные, и в целом, большинство таблиц отображают полное имя пользователя (first_name
+ last_name
).
Как правило, все поля таблицы я хочу фильтровать и упорядочивать по ним. Я решил, что хочу, чтобы данные, возвращаемые из REST API, представляли данные таблицы, поэтому сейчас я возвращаю full_name
, дополнив сериализатор Buyer
и Seller
полным именем, используя SerializerMethodField
следующим образом:
full_name = serializers.SerializerMethodField()
...
def get_full_name(self, obj) -> str:
return obj.user.get_full_name()
Однако мне также нужно будет сделать это во всех местах, где я хочу показать Buyer
/Seller
, на которые ссылается внешний ключ.
Допустим, нам нужно это в Product
, я бы сделал что-то вроде:
seller_first_name = serializers.CharField(source='seller.user.first_name')
seller_last_name = serializers.CharField(source='seller.user.last_name')
seller_full_name = serializers.SerializerMethodField()
...
def get_seller_full_name(self, obj) -> str:
return obj.seller.user.get_full_name()
Мне интересно, будет ли лучше хранить все эти поля непосредственно в объекте пользователя (first_name
, last_name
и full_name
). Здесь явно есть дублирование, поэтому я предполагаю, что в Django есть способ автоматического написания full_name
на основе first_name
и last_name
, не требуя их передачи в API.
Я уверен, что это можно сделать любым способом, но это мой первый проект, использующий DRF в качестве бэкенда, и я бы предпочел услышать опыт других сейчас, а не учиться самому через год и делать большой рефакторинг позже.
Заранее спасибо за любой совет.
Всего наилучшего,
Брэндон
Вы можете определить свойство в вашей модели:
class YourModel(models.Model):
...
@property
def full_name(self):
return f'{self.first_name} {self.last_name}'
Затем вы можете получить доступ к этому в любом сериализаторе, используя source
аргумент ключевого слова:
full_name = serializers.CharField(source='YourModel.full_name')
Вот doc