2015-04-21 2 views
4

я использую Джанго 1,8 У меня есть модель со ссылкой на django.contrib.contenttypes.ContentType:Джанго 1.8 испытания с моделями и миграции

from django.db import models 
from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 


class TaggedItem(models.Model): 
    tag = models.SlugField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.tag 

И у меня есть tests.py:

class TestObj(models.Model): 
    value = models.IntegerField(default=42, null=False) 

    def __str__(self): 
     text = "%s-%i" % ("name", self.value) 
     return text 


class MyUnitTest(TestCase): 
    def setUp(self): 
     TestObj.objects.create(value=40) 
     TestObj.objects.create() 

    def test_my_test(self): 
     obj1 = TestObj.objects.get(value=40) 
     obj2 = TestObj.objects.get(value=42) 
     self.assertEqual(obj1.value, 40) 
     self.assertEqual(obj2.value, 42) 

Когда я пытаюсь создать БД без миграции (и «тест» тоже), я получаю сообщение об ошибке с неверной ссылкой:

./manage.py syncdb 
... 
django.db.utils.ProgrammingError: ERROR: reference "django_content_type" does not exist 

Но если я создаю миграции (./manage.py makemigrations myobj), миграция содержит только models.py модель (TaggedItem):

Migrations for 'myobj': 
    0001_initial.py: 
    - Create model TaggedItem 

После того как я пытаюсь проверить мое приложение, и я получаю сообщение об ошибке со ссылкой myob_testobj не существует:

./manage.py test -v3 
Creating test database for alias 'default' ('testdb_49308_4288843')... 
Operations to perform: 
    Synchronize unmigrated apps: staticfiles 
    Apply all migrations: myobj, contenttypes, sessions 
Synchronizing apps without migrations: 
Running pre-migrate handlers for application contenttypes 
Running pre-migrate handlers for application sessions 
Running pre-migrate handlers for application myobj 
    Creating tables... 
    Running deferred SQL... 
    Installing custom SQL... 
Loading 'initial_data' fixtures... 
Checking 'mypro' for fixtures... 
No fixture 'initial_data' in 'mypro'. 
Installed 0 object(s) from 0 fixture(s) 
Running migrations: 
    Rendering model states... DONE (0.010s) 
    Applying contenttypes.0001_initial... OK (0.133s) 
    Applying contenttypes.0002_remove_content_type_name... OK (0.017s) 
    Applying myobj.0001_initial... OK (0.217s) 
    Applying sessions.0001_initial... OK (0.233s) 
Running post-migrate handlers for application contenttypes 
Adding content type 'contenttypes | contenttype' 
Running post-migrate handlers for application sessions 
Adding content type 'sessions | session' 
Running post-migrate handlers for application myobj 
Adding content type 'myobj | taggeditem' 
Adding content type 'myobj | testobj' 
Traceback 
... 
django.db.utils.ProgrammingError: ERROR: reference "myobj_testobj" does not exist 

Если я не использую миграции и запустить тест, таблица myobj_testobj была создана, но я получаю сообщение об ошибке без ссылки на «django_content_type»

/manage.py test -v3 
Creating test database for alias 'default' ('testdb_773982_6463361')... 
Operations to perform: 
    Synchronize unmigrated apps: staticfiles, myobj 
    Apply all migrations: contenttypes, sessions 
Synchronizing apps without migrations: 
Running pre-migrate handlers for application contenttypes 
Running pre-migrate handlers for application sessions 
Running pre-migrate handlers for application myobj 
    Creating tables... 
    Creating table myobj_taggeditem 
    **Creating table myobj_testobj** 
    Running deferred SQL... 
Traceback 
... 
django.db.utils.ProgrammingError: ERROR: reference "django_content_type" does not exist 

Как использовать тесты с моделями? Спасибо.

ответ

-1

Вам необходимо использовать миграции на Django 1.7 или новее. Syncdb устарел и больше не должен использоваться.

Вместо этого вы должны использовать makemigrations, за которым следует переход.

Причина, по которой вы видите эту ошибку, заключается в том, что при запуске syncdb она не запускает миграции ContentTypes, и поэтому эти модели не существуют в базе данных. При запуске модульных тестов Django автоматически выполняет команду migrate, которая объясняет, почему она работает в модульных тестах, но не при запуске вручную на dev-сервере.

+0

syncdb не так важен. Проблема при тестировании с/без файлов миграции. Если эти файлы присутствуют - таблица с тестовой моделью не создается, если нет - я получаю сообщение об ошибке без ссылки на django_content_type. Миграция вместо команды syncdb не разрешает мою проблему. Спасибо за ваш ответ – Shi3A

1

Django can not find model TestObj, потому что ваш test.py не является приложением, и нет установленного приложения, которое описывает TestObj в settings.INSTALLED_APPS. Вам необходимо добавить модель TestObj в модуль myobj.models.

После этого запустите python manage.py makemigrations myobj, а затем миграция для TestObj будет создана. Таким образом, вы можете запускать свои тесты.