Как я могу решить проблему Not found при получении из pytest-django через pk?

У меня проблема с django-pytest
Я использую, djnago-rest-framework
. Возникла проблема с тестированием. Как показано в коде ниже, я ввел одинаковые коды detail1, detail2 и detail3. Однако только detail1 проходит успешно, а detail2, detail3 показывают, что '/api/v1/stats/1/' не может быть найден. Это также происходит при выполнении delete. Мне интересно узнать причину и решение этой ошибки.

введите описание изображения здесь

// tests/test_apis.py
import json
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from stats.models import Stats


class StatsApiTests(APITestCase):
    def setUp(self):
        Stats.objects.get_or_create(blockshots=1, memo='test1')
        Stats.objects.get_or_create(blockshots=2, memo='test2')
        self.create_read_url = reverse('api:stats:stats-list')
        self.read_update_delete_url = reverse('api:stats:stats-detail', kwargs={'pk': '1'})

    def test_detail1(self):
        response = self.client.get(self.read_update_delete_url)
        data = json.loads(response.content)
        content = {
            'blockshots': 1,
            'memo': 'test1',
        }
        self.assertEqual(data, content)

    def test_detail2(self):
        response = self.client.get(self.read_update_delete_url)
        data = json.loads(response.content)
        content = {
            'blockshots': 1,
            'memo': 'test1',
        }
        self.assertEqual(data, content)

    def test_detail3(self):
        response = self.client.get(self.read_update_delete_url)
        data = json.loads(response.content)
        content = {
            'blockshots': 1,
            'memo': 'test1',
        }
        self.assertEqual(data, content)

    def test_list(self):
        response = self.client.get(self.create_read_url)
        self.assertContains(response, 'test1')
        self.assertContains(response, 'test2')

Трудно понять, что на самом деле реализовано для read_update_delete_url, поэтому я предполагаю, что это поиск ресурса по первичному ключу. В таком случае, вы можете просто добавить первичный ключ в url следующим образом:

stat_one, _ = Stats.objects.get_or_create(blockshots=1, memo='test1')
stat_two, _ = Stats.objects.get_or_create(blockshots=2, memo='test2')

self.read_update_delete_url = reverse('api:stats:stats-detail', kwargs={'pk': stat_one.pk})

В основном, get_or_create возвращает объект и состояние объекта (создан или нет). Вы можете использовать id объекта в качестве параметра функции reverse.

Вернуться на верх