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

Вернуться на верх