2015-01-21 2 views
1

큰 Django 프로젝트를 버전 1.7로 마이그레이션하려고합니다.Django 1.7 : 모델에서 빌드 된 테스트 및 URL 패턴이 "해당 테이블이 없습니다."

나는 모든 문제를 해결했으며 웹 사이트는 원활하게 작동하지만 더 이상 테스트 슈트를 실행할 수 없습니다.

populate 메서드 중에 Django의 앱 레지스트리에서 문제가 발생합니다. url 패턴이 ORM을 초기 단계에서 사용하는 몇 가지 응용 프로그램이 있습니다. 예를 들어

:

url(r'^(?:(?P<platform_slug>%s)/)?(?:(?P<genre_slug>%s)/)?(?:(?P<year>%s)/)?$' % (
    r'|'.join([i['slug'] for i in Platform.active_objects.values("slug")]), 
    r'|'.join([i['slug'] for i in Genre.objects.values("slug")]), 
    r'|'.join([str(i) for i in YEAR_FILTER_RANGE])), 
    views.archive, name="gamecard_archive") 

그것은 선택 사항이지만 구별 매개 변수를 허용하는 복잡한 패턴이지만,이 문제와 관련이 없습니다입니다.

테스트를 실행할 때 테스트 러너가 여전히 해당 단계에서 데이터베이스를 만들지 않았기 때문에 악명 높은 django.db.utils.OperationalError: no such table: contrib_platform가 발생했습니다. 전체 테스트 설정이 실행되는 순서는 1.6과 분명히 다릅니다. 하나 개의 솔루션은 사람이 더 우아한 가지고 올 경우 간단한 버전이

if 'test' in sys.argv: 
    [simple url pattern here] 
else: 
    [uber url pattern here] 

궁금 같이 sys.argv을 확인 이러한 규칙을 대체하여 시험 중에 URL 구성에서 응용 프로그램 모델에 접근하지 않도록 할 수

동안 휴대용 솔루션.

업데이트 추적 스택의 헤드를 추가하려고 생각했습니다.
실제로 테스트와 관련이 없지만 앱 구성과 관련이 있음을 보여줍니다.
Django 1.7이 잠시 동안 사용 되었기 때문에 회귀라고 말할 수는 없지만 전에 아무도 발견하지 못했습니다. 내 프로젝트의 한 코너 케이스. 그러나 Django 1.6에서는 매력처럼 작동하기 때문에 초기 단계에서 데이터베이스에 액세스 할 수 있습니다.

Traceback (most recent call last): 
    File "./manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "[...]/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line 
utility.execute() 
    File "[...]/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute 
django.setup() 
    File "[...]/lib/python2.7/site-packages/django/__init__.py", line 21, in setup 
apps.populate(settings.INSTALLED_APPS) 
    File "/Users/germanoguerrini/.virtualenvs/multi17/lib/python2.7/site-packages/django/apps/registry.py", line 115, in populate 
app_config.ready() 
    File "[...]/lib/python2.7/site-packages/django/contrib/admin/apps.py", line 22, in ready 
self.module.autodiscover() 
    File "[...]/lib/python2.7/site-packages/django/contrib/admin/__init__.py", line 23, in autodiscover 
autodiscover_modules('admin', register_to=site) 
    File "[...]/lib/python2.7/site-packages/django/utils/module_loading.py", line 74, in autodiscover_modules 
import_module('%s.%s' % (app_config.name, module_to_search)) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
__import__(name) 
... 
+0

추적 표시에 줄을 추가하십시오. 데이터베이스 테이블에 의해 지정된 URL 구성을 가진 솔루션은 간단한 앱에서 Django 1.7과 작동합니다. 어쩌면 복잡한 종속성이나주기적인 가져 오기가있을 수 있습니다. – hynekcer

답변

0

귀하의 솔루션 (데이터베이스 테이블에 의해 지정된 URL 구성)은 간단한 응용 프로그램에서 Django 1.7과 잘 작동합니다. 복잡한 종속성 또는 순환 가져 오기가있을 수 있습니다. 일부 모델에서는 가져올 때 구성된 URL이 필요합니다. 상호 의존성은 해소 될 수있다. 함수가 실제로 사용될 때 함수 내부로 가져옵니다. 'test' in sys.argv 귀하의 솔루션도 좋지만, 더 나은 테스트를 제외하지 않고 그것을 해결하는 것입니다, 당신은 또한 URL을위한 복잡한 코드를 통합 테스트를 작성할 수 있습니다.

테스트와 관련된 문제가 있기 전에 테스트에 문제가 있거나 다른 명령 (예 : python manage.py runserver)이 아니라는 것은 이상한 일입니다. 명령 사이에 차이가 있거나 testrunner가 있기 전에 문제가 발생하기 쉽습니다.

표준 솔루션은 TesCase에 urls 속성을 정의하는 것입니다. 예 : 줄 urls = 'myapp.test_urls'. docs test urlconf configuration을 참조하십시오. 이것은 나중에 버그를 수정 한 후에 유용 할 수 있습니다. 또는 과도한 것으로 보이는 URL에 대한 테스트 데이터로 조명기를 구성해야합니다.

+0

아직 문제를 해결하지는 못했지만 문제의 근원을 찾은 것 같습니다. 문제는 응용 프로그램 모델 간의 순환 종속성 오류가 많아서 장고가 자동으로 마이그레이션 파일을 작성할 수 없기 때문입니다. 게다가, 몇개의 validator 함수는 직렬화 할 수 없기 때문에'makemigrations'는 실패합니다. 그것을 고칠 긴 여정이 될 것입니다. 'migrate '를 실행하지 않기 때문에 다른 명령은 아마 오류를 내지 않습니다. 어쨌든, 적어도 당신이 올바른 길을 가다듬는다면 나는 당신의 대답을 받아 들일 것입니다. – Germano

0

일반적으로 모델 인스턴스에서 URL을 작성하는 것이 좋습니다. 그래서 아마도 다른 솔루션을 찾으려고합니다. Genre.objects.filter(platform__slug=platform_slug) (정확한 모델 구조를 알지 못함)과 같은 아싱을하면됩니다. 발생한

문제는 때문에 장고 1.7으로 도입하는 방식에 많은 변화 된 App-loading refactoring에 가장 가능성이 당신의 모델링 loadeded 등 당신이 AppConfig.ready() 방법에 URL 변화하는 코드를 삽입하려고합니다 그래서 이것은 장고가 필요한 모든 것을 로딩 한 후에 실행됩니다. 그러나 그럼에도 불구하고 나는 일반적으로 데이터베이스의 데이터를 기반으로 URL을 구성하는 것을 피합니다.

+0

그 단계에서 모델을로드하는 것이 실제로 좋지 않더라도, 제 경우에는 정말 선택의 여지가 없었습니다. 또한 Django는 가능한 한 빨리 직원을로드하는 데 훨씬 공격적으로 보입니다. 그러나 결국 @hynekcer 응답에 대한 내 의견에 쓴 것처럼 내가 가진 오류는 더 큰 문제를 숨기고있었습니다. 그래도 고마워. – Germano

관련 문제