Каковы лучшие практики хранения дублирующихся данных в моделях 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