AttributeError: этот экземпляр QueryDict является неизменным для тестовых случаев - PullRequest
0 голосов
/ 17 апреля 2020

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

AttributeError: Этот экземпляр QueryDict является неизменным

Вот мой набор параметров:

    def create(self, request, *args, **kwargs):

        context = {'view': self, 'request': request}

        addresses = request.data.pop("addresses", None)
        serializer = self.get_serializer(data=request.data, context=context)
        serializer.is_valid(raise_exception=True)
        response = super(WarehouseViewSet, self).create(request, *args, **kwargs)
        if addresses is None:
            pass
        else:
            serializer = self.get_serializer(data=request.data, context=context)
            serializer.is_valid(raise_exception=True)
            addresses = serializer.update_warehouse_address(request, addresses, response.data["id"])
            response.data["addresses"] = addresses
        return Response(data=response.data, status=status.HTTP_201_CREATED)

и здесь мой тестовый пример для того же представления:

    def test_create_warehouse_authenticated(self):
        response = client.post(
            reverse('warehouse_list_create'),
            data={
                'name': self.test_warehouse['test_warehouse']['name'],
                'branch': self.test_warehouse['test_warehouse']['branch'],
            },
            **{'HTTP_AUTHORIZATION': 'Bearer {}'.format(
                self.test_users['test_user']['access_token']
            )},
        )

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

Как исправить эту ошибку?

1 Ответ

0 голосов
/ 19 апреля 2020

Попробуйте установить format='json' при вызове client.post, а не полагаться на значение по умолчанию. Вы не упоминаете, какой тестовый клиент вы используете, но вы должны использовать APIClient

client = APIClient()
client.login(...)
client.post(..., format='json')

Более новый Django имеет неизменный QueryDict, поэтому эта ошибка всегда будет происходить, если вы получаете данные из строки запроса или из многочастного тела формы. Тестовый клиент использует multipart по умолчанию, что приводит к этой проблеме.

Последнее средство : если вам нужно опубликовать несколько частей, а также изменить запрос ( очень редко , подумайте о размещении полей изображения + формы), вы можете вручную установить _mutable флаг на QueryDict, чтобы разрешить его изменение. Это

setattr(request.data, '_mutable', True)
...