2016-11-03 7 views
0

私は自分のプロジェクトでDjango Rest Frameworkを使用しています。 "django.db.utils.ProgrammingError:関係 "患者" は存在しません" 私はエラーを取得するテストを実行するとDjango Rest Framework "django.db.utils.ProgrammingError:relation" patient "does not exist"

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, 
      ]) 

:私はテストを書かれている 。私が理解するように、このエラーは、テーブルがテストデータベースに作成されていない場合に発生します。私は何をしなければなりませんか?ありがとう

+0

私達にあなたのモデルを示し、これを行うには、custom test runnerと書き換えてsetup_test_environmentを作成することができます最初に – sebb

+0

テーブルを移行してみてください。 Re [Django Migrations](https://docs.djangoproject.com/en/1.10/topics/migrations/) –

+0

私は、Metaクラスでmanaged = Falseの設定をしています。 – regen

答えて

1

まず、すべての.pycファイルをプロジェクトから削除します。次のコマンドを1つずつ実行します。

$ 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"というという名前のテーブルが存在しないためです。

+0

'managed = False'を削除すると、私は実際のデータベースに損害を与える可能性があります。実際のデータベースは既に作成されており、私はそれを台無しにしたくありません。 'managed = True'なしで自分のコードをテストすることはできますか? – regen

+0

@regenあなたの実際のデータベースは何ですか.. ??患者テーブルは明らかにあなたのデータベースにはないので、 'managed = True'は新しいdbテーブル 'patient'を作成します。 –

+0

@regen患者モデルのメタクラスでのみ "managed = False"を変更します。 –

0

テスト用に作成されたモデルを使用する共通のパターンは、テストを実行する前に管理対象としてマークすることです。

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

関連する問題