Добавление полей в сериализатор динамически

У меня есть View, в котором я получаю запрос и он возвращает сериализованные данные

views.py

class AllotmentReportsView(APIView):
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request):
        sfields = request.GET['sfields']           #I can get the fields in params 
        serializer = AllotReportSerializer(items, many=True)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

serializer.py

class AllotReportSerializer(serializers.ModelSerializer):

    send_from_warehouse = serializers.SlugRelatedField(read_only=True, slug_field='name')
    transport_by = serializers.SlugRelatedField(read_only=True, slug_field='name')
    sales_order = AllotSOSerializer(many=False)
    flows = AllotFlowsSerializer(many=True)

    class Meta:
        model = Allotment
        fields = ( 'transaction_no', 'dispatch_date', 'sales_order',
                   'is_delivered', 'send_from_warehouse', 'transport_by',
                   'flows', )

Вместо определения полей в сериализаторе могу ли я передавать поля динамически из представления sfields и передавать их в сериализатор ?

Описывать поля в классе ModelSerializer не обязательно. Django сгенерирует его автоматически в соответствии с информацией о модели:

class AllotReportSerializer(serializers.ModelSerializer):

    class Meta:
        model = Allotment
        fields = ( 'transaction_no', 'dispatch_date', 'sales_order',
                   'is_delivered', 'send_from_warehouse', 'transport_by',
                   'flows', )

достаточно

Если вы хотите добавить поля, которых нет в модели, я думаю, это возможно с помощью мета-классов и функции setattr(). Но это выглядит бессмысленно. Также необходимо добавить логику, как динамически устанавливать тип и параметры поля.

Вам не нужно описывать поля в ModelSerializer -

class AllotReportSerializer(serializers.ModelSerializer):

    class Meta:
        model = Allotment
        fields = ( 'transaction_no', 'dispatch_date', 'sales_order',
                   'is_delivered', 'send_from_warehouse', 'transport_by',
                   'flows', )
    extra_kwargs = {
           "url": {
               "lookup_field": "slug",  
               "view_name": "api-your-model-name-detail",
            }

Вы можете определить дополнительные kwargs, если хотите, описанным выше способом. Этого достаточно.

Если вы хотите добавить все поля в вашу модель, вы можете сделать это -

class Meta:
    model = Your model name
    fields = "__all__"

Подробнее об этом можно прочитать здесь - https://www.django-rest-framework.org/api-guide/serializers/

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