Добавление полей в сериализатор динамически
У меня есть 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/