2009-09-09 3 views
4

저는 최근 여가 시간에 일부 웹 응용 프로그램을 장고로 실험하기 시작했습니다. 데이터 모델을 설계 할 때 상속을 사용하여 웹 사이트 사용자를 정의하거나 프레임 워크에서 이미 제공 한 User 클래스로 monkey patching이라는 기술을 사용하는 딜레마에 대해 알아 봤습니다.장고 및 원숭이 패치 문제

User.add_to_class('location', models.CharField(max_length=250,blank=True))

을하고 syncdb 명령을 실행 :

난 ( python manage.py validate에있어서, 에러없는 등 내 모델을 정의한 후에)에 의해 필드를 추가하려고. 그러나이 오류가 계속 발생합니다.

OperationalError: no such column: auth_user.location

내가 사이트 또는 manage.py 셸의 관리자보기에 있는지 여부. 누락 된 추가 단계가 있어야하지만 전체 원숭이 패치 기술에 대한 제한된 문서가있는 것 같습니다. 그래서 상속 재산에 의존하기 전에 도움을 요청합니다. 추가 문서에 대한 코드, 팁 또는 지침은 물론 환영합니다.

미리 감사드립니다.

추신. 나는이 기술이 추악하고, 아마 잘못 알고 있다는 것을 알고있다. ;)

답변

7

필드에 모델을 추가 할 때 '공식적인'방법이라도 데이터베이스를 마이그레이션해야합니다. 장고는이를 수행하지 않습니다. 테이블을 삭제하고 ./manage.py syncdb을 다시 실행하십시오.

이러한 종류의 작업을 관리하는 south과 같은 마이그레이션 프레임 워크 중 하나를 조사하고 싶을 수 있습니다.

+0

이것은 하나의 트릭을 했어! sqlall 명령이 User 클래스와 관련된 SQL을 표시하지는 않지만. 감사! –

0

Djangos 프레임 워크는 메타 테이블을 사용하여 테이블을 초기화합니다. 즉, 클래스를 다시 초기화하지 않으면 새 열에서 원숭이 패치를 수행 할 수 없다는 것을 의미합니다. 클래스를 다시 초기화하지 않으면 가능하지도 않습니다. (있을 수 있습니다).

자세한 내용은 Difference between returning modified class and using type()을 참조하십시오.

+0

Django는 모델 클래스를 만들 때 모든 종류의 메타 클래스 속임수를 수행하지만 add_to_class 메서드 (OP가 수행 한 것처럼)를 호출하면 이후에 동적으로 새 필드를 동적으로 추가하는 정확한 방법입니다 (필요한 속임수를 수행함).단순히 (add_to_class를 호출하지 않고) 클래스 속성으로 필드를 monkeypatching하면 효과가 없습니다. 여기에서의 문제는 메타 클래스와 관련이 없으며, 장고 (Django)가 내장 된 데이터베이스 스키마 마이 그 레이션과 관련이 없다. –

+0

아. 그가 실제로 아무 것도하지 않을 때 나는 원숭이 패칭에 대한 그의 언급에 속아 넘어졌다. –

0

당신은 당신의 monkeypatch가 어디에 정의되어 있는지에 관한 문제가 발생할 것 같네요. django syncdb는 "순수한"인증 애플리케이션에서만 databse 테이블을 생성하므로 모델에 "위치"가 없으므로 패치가있는 사이트는 필드를 찾습니다.

아마도 사용자 프로필에 추가 정보를 추가하는 고통스러운 방법은 in Django docs입니다.

13

두 가지 방법 모두 대안이 있습니다. 간단히 a related profile model을 사용하는 것입니다. 이것은 또한 문서화가 잘 된 권장 접근 방식입니다. 아마도 add_to_class 접근법이 잘 문서화되지 않은 이유는 이유가있다면 explicitly discouraged이기 때문입니다.

+0

관련 프로필은이 문제를 해결하는 인기있는 방법 인 것 같습니다. 사용자 필드를 참조하는 코딩 스타일은 다소 못 생기고 다소 직관적입니다. 나는 이것을 확실히 탐구 할 것이다. –

+0

+1 : 그냥 프로필을 사용하여, 그것은 훌륭하게 작동합니다. –

+0

이것은 django.contrib.auth 시스템에서 사용자 시스템을 확장하는 데 권장되는 방법입니다. 장기간에 걸쳐이 시스템을 유지 관리해야하는 경우 프로파일을 사용하면 프레임 워크 자체를 새로 업그레이드 할 수있는 최상의 기회를 얻을 수 있습니다. – wlashell

관련 문제