Дизайн сериализатора? Когда мне нужен новый сериализатор? - PullRequest
0 голосов
/ 08 марта 2019

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

Пример:

class ProductReviewSerializer(serializers.ModelSerializer):

    product_name = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = ProductReview
        fields = (
            'uuid',
            'review_score',
            'user',
            'product',
        )
        read_only_fields = (
            'uuid',
        )

    def get_product_name(self, obj):
        something ...

Я использую этот сериализатор для создания новых экземпляров ProductReview.Кроме того, я хочу использовать этот сериализатор для обновления экземпляров ProductReview.Для этого сериализатор должен проверять данные от конечной точки API, в которой пропущено множество полей, например, DRF API получает только JSON {review_score: 2).Для данного примера я не могу получить действительный сериализатор, если только я не объявил группу полей как read_only, что, в свою очередь, не работает для создания новых экземпляров.

Сериализатор для редактирования ProductReviews, который принимаетданные ({review_score: ...}) сверху будут выглядеть примерно так:

class ProductReviewEditSerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductReview
        fields = (
            'review_score',
        )

Я чувствую, что создаю здесь некоторые глупые недостатки дизайна.Но можете ли вы указать мне путь к лучшему решению?

Можно ли создать серию отдельных сериализаторов?Мои интуитивные ощущения говорят мне, что каждая модель должна иметь только один сериализатор ...

1 Ответ

1 голос
/ 08 марта 2019

На самом деле это очень хороший вопрос.Я разделяю мою точку зрения, когда мы должны использовать сериализатор.Было бы здорово зачитать мнение других людей по этому поводу.

Зачем нам нужен Serializer

  1. Самая важная причина в том, что мы не всегда доверяем пользовательскому вводу как идеальному.Возможно, некоторые злоумышленники намерены причинить вред системе.Поэтому мы всегда должны проверять как можно более совершенный способ проверки пользовательских данных, прежде чем вносить какие-либо изменения в нашу модель / систему.
  2. Мы хотим, чтобы наш ответ был в устоявшемся формате.Может потребоваться добавить пару логических операций помимо обычного ответа на запрос БД.

Может ли один сериализатор выполнять все возможные работы

Я твердо верю, что это возможно в большинстве случаев.Тем не менее, есть некоторые случаи, когда это невозможно.Я обнаружил, что DRF-ModelSerializer очень силен для этой работы и очень хорошо организован.Если ваша модель определения правильно организована.Если требуется дополнительный ответ, мы всегда можем использовать SerializerMethodField для этой работы.

Возможное решение вашей проблемы

У меня есть намерение, чтобы вы не передавали экземпляр модели, который вы хотите обновить данными запроса.Для частичного обновления с помощью serialize мы должны сделать что-то вроде этого

serializer = ProductReviewSerializer(product_review_model_instance, data=request.data, partial=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...