【问题标题】:AttributeError: This QueryDict instance is immutable for test casesAttributeError:此 QueryDict 实例对于测试用例是不可变的
【发布时间】:2020-04-17 17:38:57
【问题描述】:

我正在尝试更改我的 request.data 字典以删除一些附加字段。 它在视图中工作得很好。 但是当我运行相同的测试用例时,我得到了这个错误:

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)

如何解决这个错误?

【问题讨论】:

    标签: python django django-rest-framework django-tests


    【解决方案1】:

    在调用client.post时尝试设置format='json',而不是依赖默认值。您没有提及您使用的是哪个测试客户端,但您应该使用APIClient

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

    较新的 Django 具有不可变的 QueryDict,因此如果您从查询字符串或多部分表单正文中获取数据,则始终会发生此错误。测试客户端默认使用multipart,导致出现此问题。

    不得已:如果您需要发布多部分,并且还要修改查询字典(非常罕见,认为发布图片+表单字段)您可以手动设置@ QueryDict 上的 987654326@ 标志以允许更改它。这是

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

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多