LIstSerializer AssertionError - PullRequest
       1

LIstSerializer AssertionError

0 голосов
/ 23 января 2019

Я пытаюсь использовать ListSerializer, чтобы я мог создавать / десериализовать несколько объектов в списке на POST.Я следовал руководству на https://www.django -rest-framework.org / api-guide / serializers / # listserializer , но, похоже, столкнулся с этой ошибкой при посещении конечной точки.

assert self.child is not None, '``child`` is a required argument.'

python3.7/site-packages/rest_framework/serializers.py in __init__, line 592

Мои сериализаторы выглядят следующим образом:

class PredictionListSerializer(serializers.ListSerializer):

    def update(self, instance, validated_data):
        pass

    def create(self, validated_data):
        predictions = [Prediction(**item) for item in validated_data]
        return Prediction.objects.bulk_create(predictions)
class NestedPredictionSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    # Nested Serializer
    data = DataSerializer()

    class Meta:
        model = Prediction
        list_serializer_class = PredictionListSerializer
        fields = ('id', 'specimen_id', 'data' 'date_added',)
        extra_kwargs = {
            'slug': {'validators': []},
        }
        datatables_always_serialize = ('id',)

При инициализации ListSerializer выдается ошибка подтверждения, однакоСериализатор инициализируется во ViewSet следующим образом.

class BulkPredictionViewSet(viewsets.ModelViewSet):
    queryset = Prediction.objects.all()
    serializer_class = PredictionListSerializer

Кто-нибудь знаком с этой проблемой?Мне интересно, влияет ли это на отсутствие контроля над инициализацией сериализатора (потому что я использую ViewSet).Если я пытаюсь передать NestedPredictionSerializer в ViewSet, я получаю "Invalid data. Expected a dictionary, but got list."

EDIT:

Я смог переписать метод get_serializer в моем ViewSet, чтобы установить many = True и передатьСериализатор как мой NestedPredictionSerializer, который распознает список на POST.Хауэбер, теперь я получаю ошибку When a serializer is passed a ``data`` keyword argument you must call ``.is_valid()`` before attempting to access the serialized ``.data`` representation. You should either call ``.is_valid()`` first, or access ``.initial_data`` instead.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я смог заставить работать и POST, и GET, когда следующий совет по этому прочтению совмещался с этим ответом: https://stackoverflow.com/a/45651309/3439441

Мои переопределенные значения ViewSet.get_serializer теперь выглядят так:

    def get_serializer(self, *args, **kwargs):
        if self.request.method.lower() == 'post':
            data = kwargs.get('data')
            kwargs['many'] = isinstance(data, list)
        return super(BulkPredictionViewSet, self).get_serializer(*args, **kwargs)
0 голосов
/ 23 января 2019

Просто используйте many=True только для create action :

class BulkPredictionViewSet(viewsets.ModelViewSet):
    queryset = Prediction.objects.all()
    serializer_class = NestedPredictionSerializer

    def get_serializer(self, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        if if self.action == 'create': 
            kwargs['many'] = True
        return serializer_class(*args, **kwargs)

Вам не нужно использовать PredictionListSerializer, так как many=True создаст ListSerializer автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...