Я получаю typerror когда использую метод запроса в drf - PullRequest
0 голосов
/ 12 марта 2019

С некоторой помощью я решил эту проблему .

Мой API работает, но сегодня я обнаружил эту ошибку, когда я пытаюсь получить доступ к '/ api / v1 / docs'

AttributeError at /api/v1/docs/

'NoneType' object has no attribute 'method'

Я знаю, что ошибка здесь:

    def get_fields(self):
        fields = super().get_fields()
        if self.context['request'].method in ['POST', 'PATCH', 'PUT']:
            fields['products'] = serializers.ListField(
                write_only=True,
                child=serializers.IntegerField()
            )
        return fields

Когда я удаляю .method, доступ к /api/v1/docs/ работает, но мое решение разместить некоторые продукты в комплектных продуктах не работает.

Мой код:

view.py

class ProductViewSet(viewsets.ModelViewSet):

    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    model = Product


class BundleProductViewSet(viewsets.ModelViewSet):

    queryset = BundleProduct.objects.all()
    serializer_class = BundleProductSerializer
    model = BundleProduct


class BundleViewSet(viewsets.ModelViewSet):

    queryset = Bundle.objects.all()
    serializer_class = BundleSerializer
    model = Bundle

1 Ответ

0 голосов
/ 12 марта 2019

Это, вероятно, вызвано тем, что этот сериализатор используется как вложенный сериализатор в другом сериализаторе. Итак, скажем, определение для рассматриваемого сериализатора:

class MySerializer(serializers.Serializer):
    ...

И у вас есть другой сериализатор, подобный этому:

class OtherSerializer(serializers.Serializer):
    my_field = MySerializer()

В этом случае при создании экземпляра OtherSerializer его контекст не передается автоматически MySerializer , поэтому не будет запроса в контексте MySerializer . Вы можете либо добавить контекст во вложенный сериализатор вручную, либо в методе get_fields проверить, что запрос существует в self.context и продолжить работу соответствующим образом.

Кроме того, я не уверен, чего вы пытаетесь достичь, но если вы предоставите поле с

write_only=True

в определении класса сериализатора поле не будет присутствовать при чтении сериализатора, т.е. для запросов get в целом, что похоже на то, что вы пытаетесь сделать здесь. Таким образом, добавление поля products как write_only будет иметь тот же эффект, вам не нужно переопределять get_fields method

...