繁体   English   中英

Django Rest框架“ django.db.utils.ProgrammingError:关系“患者”不存在”

[英]Django Rest Framework “django.db.utils.ProgrammingError: relation ”patient“ does not exist”

我在我的项目中使用Django Rest Framework。 我已经写过测试:

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'})

models.py

class Patient(models.Model):
    firstname = models.TextField()
    lastname = models.TextField()
    secondname = models.TextField()

    class Meta:
        db_table = "patient"
        managed = False

    def __str__(self):

        return ' '.join([
            self.firstname,
            self.lastname,
            ])

运行测试时,出现错误:“ django.db.utils.ProgrammingError:关系“患者”不存在”。 据我了解,如果未在测试数据库中创建表,则会发生此错误。 我必须做什么? 谢谢

首先从项目中删除所有.pyc文件,然后依次运行以下命令。

$ django-admin.py migrate auth
$ django-admin.py migrate contentypes
$ django-admin.py migrate sites
$ django-admin.py migrate YOUR_USER_APP
$ django-admin.py migrate

如果这不起作用,则对所有应用程序一一使用makemigrations,如下所示:

$ python manage.py makemigrations 
$ python manage.py migrate --fake

并确保删除所有扩展名为.pyc的文件。

为此,请从您的代码中删除“ managed = False” 该错误是因为数据库中没有名为“病人”的表。

为了为测试创建模型,我使用的一种常见模式是在执行测试之前将它们标记为已托管。 为此,您可以创建一个自定义测试运行程序setup_test_environment

class CustomRunner(DiscoverRunner):
    def setup_test_environment(self, *args, **kwargs):
        from django.db.models.loading import get_models
        self.unmanaged_models = [
            m for m in get_models() if not m._meta.managed
        ]

        for m in self.unmanaged_models:
            m._meta.managed = True

然后测试设置将以字符串形式指定测试运行器的模块路径:

TEST_RUNNER = module.path.to.CustomRunner

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM