簡體   English   中英

如何在 django rest api 測試中的 GET 請求中發送數據

[英]How to send data in GET request in django rest api test

DB中有“顧問”和“價格”表,“價格”有一個“顧問”的外鍵。 我想獲取與特定顧問相關的所有價格記錄。 但是當我使用APITestCase發送 GET 請求時出現錯誤。

視圖.py:

class PriceAPI(APIView):
    serializer_class = PriceSerializer
    def get(self, request):
        consultant_type = request.data.get('type', None)
        try:
            consultant = Consultant.objects.get(user=request.user, type=consultant_type)
        except Consultant.DoesNotExist:
            return Response(status=status.HTTP_406_NOT_ACCEPTABLE)
        try:
            serializer = self.serializer_class(consultant.prices, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except:
            return Response(status=status.HTTP_400_BAD_REQUEST)

測試.py:

class PriceTest(APITestCase):
    def setUp(self):
        ###
    def test_get_delete_price(self):
        response = self.client.get(
            reverse('price'),
            data=json.dumps(
                {'type': 'sports'}),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, status.HTTP_200_OK)

我收到此錯誤:

Error
Traceback (most recent call last):
  File "D:\programming\Pycharm\Projects\Django Projects\CAPP\capp_api\tests.py", line 394, in test_get_delete_price
    content_type='application/json'
  File "D:\programming\Pycharm\Projects\Django Projects\CAPP\venv\lib\site-packages\rest_framework\test.py", line 286, in get
    response = super().get(path, data=data, **extra)
  File "D:\programming\Pycharm\Projects\Django Projects\CAPP\venv\lib\site-packages\rest_framework\test.py", line 194, in get
    'QUERY_STRING': urlencode(data or {}, doseq=True),
  File "D:\programming\Pycharm\Projects\Django Projects\CAPP\venv\lib\site-packages\django\utils\http.py", line 113, in urlencode
    for key, value in query:
ValueError: not enough values to unpack (expected 2, got 1)

此錯誤與請求中發送的數據有關。 我怎樣才能在 GET 請求中做到這一點?

GET 請求無法通過 JSON 主體。 參數可以通過查詢字符串傳遞。 因此,在 test.py 中的數據必須更改,並且在 views.py 中通過request.GET.get('field') “獲取” function 我們可以訪問該參數。

測試.py:

response = self.client.get(
    reverse('price'),
    data={'type': 'sports'},  # This line is changed
    content_type='application/json'
)
self.assertEqual(response.status_code, status.HTTP_200_OK)

視圖.py:

consultant_type = request.GET.get('type', None)

這個:

'QUERY_STRING': urlencode(data or {}, doseq=True),

讓我認為data應該是一個字典,但是您正在使用json.dumps()將其轉換為字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM