Django Rest Framework“django.db.utils.ProgrammingError:relation”patient“不存在”

时间:2016-11-03 12:39:27

标签: python django unit-testing django-rest-framework

我在我的项目中使用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:关系”patient“不存在”。据我所知,如果未在测试数据库中创建表,则会发生此错误。我必须做什么?感谢

2 个答案:

答案 0 :(得分:1)

首先从项目中删除所有.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'。该错误是因为您的数据库中没有名为“patient”的表。

答案 1 :(得分:0)

为测试创建模型(我使用的常见模式)是在测试执行之前将它们标记为托管。为此,您可以创建custom test runner并覆盖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

然后测试设置将specify作为字符串的测试运行器的模块路径:

TEST_RUNNER = module.path.to.CustomRunner