【问题标题】:DRF test client unable to post list of JSONDRF 测试客户端无法发布 JSON 列表
【发布时间】:2015-07-07 14:39:17
【问题描述】:

我创建了一个ListCreateAPIView,如下所示:

 13 class CartItemView(generics.ListCreateAPIView):
 14     serializer_class = CartItemSerializer
 15
 16     def get_serializer(self, *args, **kwargs):
 17         if 'data' in kwargs:
 18             data = kwargs['data']
 19             if isinstance(data, list):
 20                 kwargs['many'] = True
 21
 22         return super(CartItemView, self).get_serializer(*args, **kwargs)
 23

这是序列化程序:

 47 class CartItemSerializer(serializers.ModelSerializer):
 48     menu_item = serializers.PrimaryKeyRelatedField(queryset = MenuItem.objects.all())
 49     cart = serializers.PrimaryKeyRelatedField(queryset = Cart.objects.all(), required=False)
 50
 51     class Meta:
 52         model = CartItem
 53         depth = 1
 54
 55     def create(self, validated_data):
 56         menu_item = validated_data['menu_item']
 57         cart = validated_data['cart']
 58         cart_item = CartItem.objects.create(menu_item = menu_item, cart = cart, no_of_units = validated_data['no_of_units'])
 59         if cart.cart_state == Cart.EMPTY:
 60             cart.item_added_to_cart()
 61             cart.save()
 62         return cart_item

现在,我正在尝试发布来自测试的 JSON 对象列表,如下所示:

 1 from rest_framework.test import APITestCase
 .....
 17 class CartItemViewTest(APITestCase):
 18     def test_create_cart_items(self):
 22         data = [{'cart': '4', 'total_qty': '5', 'menu_item': '1'}]
 23         cart_item_url = '/api/v1/cart/items/'
 24         response = self.client.post(cart_item_url, data=data)
 26         print response.data
 29         self.assertEqual(len(resp.data['cart_items']), 1)

但它会引发以下错误:

======================================================================
ERROR: test_create_cart_items (app.tests.CartItemViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/ubuntu/src/app/tests.py", line 24, in test_create_cart_items
    response = self.client.post(cart_item_url, data=data)
  File "/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 168, in post
    path, data=data, format=format, content_type=content_type, **extra)
  File "/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 89, in post
    data, content_type = self._encode_data(data, format, content_type)
  File "/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/rest_framework/test.py", line 64, in _encode_data
    ret = renderer.render(data)
  File "/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/rest_framework/renderers.py", line 678, in render
    return encode_multipart(self.BOUNDARY, data)
  File "/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/django/test/client.py", line 168, in encode_multipart
    for (key, value) in data.items():
AttributeError: 'list' object has no attribute 'items'

顺便说一句,当我从 REST 客户端启动该 API 时,它工作得非常好。我使用测试客户端发布 json 列表的方式有问题吗?

【问题讨论】:

  • 你能添加CartItemSerializer的代码吗?
  • @RahulGupta 啊!错过了。。现在添加。

标签: python django django-rest-framework


【解决方案1】:

你应该指定json格式:

response = self.client.post(cart_item_url, data=data, format='json')

【讨论】:

  • {u'non_field_errors': [u'Invalid data. Expected a dictionary, but got unicode.']}
  • 对不起...数据应该是实际的python对象...检查我的编辑;)
  • 您也可以在设置DRF-Docu中设置默认测试格式。
【解决方案2】:

你可以试试这个

response = self.client.post(cart_item_url, json.dumps(data), content_type='application/json')

这对我有用

【讨论】:

    【解决方案3】:

    尝试将content_type 指定为application/json

    response = self.client.post(cart_item_url, data=json.dumps(data), content_type='application/json')
    

    【讨论】:

      【解决方案4】:

      试试:

      response = self.client.post(cart_item_url, data=json.dumps(data)), headers={'Content-Type': 'application/json'})
      

      【讨论】:

      • 现在显示:AttributeError: 'str' object has no attribute 'items'
      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2017-02-27
      • 2016-06-10
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多