在使用 Django Rest Framework 时,在运行测试时遇到错误 “django.db.utils.ProgrammingError: relation “patient” does not exist”。

  1. 解决方案
    为了解决此错误,可以采取以下步骤:

    1. 首先,确保在测试数据库中创建了名为 “patient” 的表。可以通过运行以下命令来创建表:

      python manage.py migrate
      
    2. 如果已经创建了 “patient” 表,但仍然遇到此错误,则可以尝试以下方法:

      • 删除所有带 .pyc 扩展名的文件。

      • 逐个运行以下命令:

        django-admin.py migrate auth
        django-admin.py migrate contenttypes
        django-admin.py migrate sites
        django-admin.py migrate YOUR_USER_APP
        django-admin.py migrate
        
      • 如果以上方法仍然无效,则可以使用 makemigrations 命令逐个为所有应用生成迁移文件,然后运行 migrate 命令应用这些迁移。

      • 确保从代码中删除了 managed = False

    3. 如果以上方法都无法解决问题,则可以尝试以下方法:

      • 在测试用例中使用 @override_settings 装饰器来覆盖数据库设置。
      • 在测试用例中使用 TransactionTestCase 类而不是 APITestCase 类。
    4. 如果仍然遇到错误,则可以尝试以下方法:

      • 检查数据库是否已启动并正在运行。
      • 检查数据库用户是否具有对数据库的访问权限。
      • 检查数据库连接字符串是否正确。
    5. 如果以上方法都无法解决问题,则可以向 Django 社区寻求帮助。

代码例子:

# 在测试用例中使用 @override_settings 装饰器来覆盖数据库设置
@override_settings(DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}})
class PatientTests(APITestCase):

    def test_create_patient(self):
        url = reverse('patient-list')
        data = {'firstname': 'ivan', 'lastname': 'ivanov'}
        response = self.client.post(url, data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(Patient.objects.count(), 1)
        self.assertEqual(Patient.objects.get().firstname, 'ivan')

    def test_get_patient(self):
        url = reverse('patient-detail', args=[1])
        response = self.client.get(url)
        self.assertEqual(response.data, {'firstname': 'ivan'})
# 在测试用例中使用 TransactionTestCase 类而不是 APITestCase 类
class PatientTests(TransactionTestCase):

    def test_create_patient(self):
        url = reverse('patient-list')
        data = {'firstname': 'ivan', 'lastname': 'ivanov'}
        response = self.client.post(url, data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(Patient.objects.count(), 1)
        self.assertEqual(Patient.objects.get().firstname, 'ivan')

    def test_get_patient(self):
        url = reverse('patient-detail', args=[1])
        response = self.client.get(url)
        self.assertEqual(response.data, {'firstname': 'ivan'})
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐