2016-11-03 2 views
0

Я использую Django Rest Framework в своем проекте. я написал тесты:Django Rest Framework «django.db.utils.ProgrammingError: отношение« пациент »не существует»

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: отношение "пациент" не существует" , Насколько я понимаю, эта ошибка возникает, если таблица не создана в тестовой базе данных. Что мне делать? Спасибо

+0

показать нам свои модели сначала – sebb

+0

Попробуйте перенести свой стол. Reffer [Django Migrations] (https://docs.djangoproject.com/en/1.10/topics/migrations/) –

+0

У меня есть = Ложное задание в мета-классе. – regen

ответ

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' с вашего кода. Ошибка заключается в том, что в вашей базе данных нет таблицы с именем «пациент».

+0

Если я удалю 'managed = False', я могу повредить свою реальную базу данных. Настоящая база данных уже создана, и я не хочу ее испортить. Могу ли я проверить свой код без «managed = True»? – regen

+0

@regen какая у вас настоящая база данных .. ?? Таблица пациентов явно не в вашей базе данных, поэтому «managed = True» создаст только новую таблицу пациентов «db». Какой вред в этом? –

+0

@regen Изменить «managed = False» только в мета-классе модели пациента. –

0

Чтобы модели, созданные для ваших тестов, использовали обычный шаблон, чтобы отметить их как управляемые до выполнения тестов. Чтобы сделать это, вы могли бы создать custom test runner и overrride 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

Смежные вопросы