Лучшая практика сериализации различных данных для 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" Для решения этой проблемы снова можно использовать шаблон адаптера.