Лучшая практика сериализации различных данных для ModelSerializer

У меня есть model с именем Client, которое выглядит следующим образом:

class Client(models.Model):
    first_name = models.CharField("First Name", max_length=50)
    last_name = models.CharField("Last Name", max_length=50)
    email_1 = models.EmailField("Email", max_length=50)
    phone_1 = models.CharField("Phone", max_length=15)

Мое приложение получает данные из 2 разных источников

Источник A

source_a_data = {
    "first_name": "John",
    "last_name": "Doe",
    "email_1": "johndoe@gmail.com",
    "phone_1": "5555555555"
}

Источник B

source_b_data = {
    "firstName": "John",
    "lastName": "Doe",
    "email1": "johndoe@gmail.com",
    "phone1": "5555555555"
}

Я знаю, что создание сериализатора для источника A будет выглядеть следующим образом:

serializers.py

class SourceAClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = "__all__"

serializer = SourceAClientSerializer(data=source_a_data)
serializer.is_valid(raise_exception=True)
serializer.save()

Имеет ли смысл создать новую ModelSerializer для источника B? Или я что-то упускаю?

Джон!

В ситуации, когда вы думаете о создании двух различных бизнес-логик/логик кодирования, это может иметь смысл, но даже в этой ситуации достаточно одного сериализатора для создания всей необходимой вам логики.

Например, если вы хотите создать валидацию для "firstName" и "email" для проверки пользователя с этой информацией и еще одну валидацию для телефона, для этого достаточно 1 сериализатора.

Надеюсь, это может помочь! С уважением.

Вы можете упростить эту задачу, используя шаблон адаптера, который преобразует все ваши источники данных в определенный формат, например, это упростит логику валидации и другие вещи, которые вы можете постоянно менять, например.

def adpat_source_b( data ):
   new_data = {}
   new_data["first_name"]  = data["firstName"]
   new_data["last_name"] = data["lastName"]
   new_data["email_address"] = data["email1"]
   new_data["phone_number" ] = data["phone1"]
   return new_data

class serializer

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = "__all__"

Обработка ошибки валидации?

Для источника A ошибка может быть обработана без проблем, но для источника B сообщение/поле ошибки потребует модификации, иначе клиент B увидит, что требуется "phone_number", хотя клиент A отправил "phone1" Для решения этой проблемы снова можно использовать шаблон адаптера.

Шаблон адаптера

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