2013-03-18 4 views
4

프로젝트를 Django 1.5로 업데이트해야 새로 사용 가능한 사용자 정의 사용자 모델을 이용할 수 있습니다. 그러나 외래 키가있는 모델을 포함하는 재사용 가능한 앱을 사용자에게 이전하는 데 문제가 있습니다. 현재 외래 키는 auth.User이지만 사용자 정의 사용자 모델은 myapp.CustomUser을 가리켜 야합니다. 따라서 일종의 마이그레이션이 필요합니다. 다시 사용할 수있는 앱이기 때문에 마이그레이션 파일을 만들 수 없습니다. 앱이 업데이트 될 때마다 마이 그 레이션을 다시 작성해야한다는 것을 기억해야하기 때문에 (마이 그 레이션 충돌이있을 수 있음) 미래의 증거가되지는 않을 것입니다. 따라서 정확하게 그럴듯한 해결책은 아닙니다.재사용 가능한 장고 응용 프로그램 모델을 사용자 정의 사용자 모델로 마이그레이션하는 데 문제가 있습니다

각 프로젝트를 포크 화하고 마이그레이션 파일을 추가 한 다음 대신이 문제를 해결할 수있는 방법이 있습니까?

일부 코드 : 내 프로젝트 내 프로젝트

from django.conf import settings 
from django.contrib.auth.models import AbstractUser 

class CustomUser(AbstractUser): 
    ... 

settings.py에서

models.py 재사용 가능한 응용 프로그램

from django.conf import settings 
from django.db import models 

UserModel = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') 

class ModelA(models.Model): 
    user = models.ForeignKey(UserModel) 

models.py에서

AUTH_USER_MODEL = 'myapp.CustomUser' 

답변

3

재사용 가능한 응용 프로그램에서 사용자에게 외래 키를 생성하는 마이 그 레이션이있는 경우 Django 1.5의 사용자 정의 사용자 모델을 지원하기 위해 다음을 수행 할 수 있습니다.

try: 
    from django.contrib.auth import get_user_model 
except ImportError: # django < 1.5 
    from django.contrib.auth.models import User 
else: 
    User = get_user_model() 

class Migration(SchemaMigration): 

    def forwards(self, orm): 
     db.create_table('reusableapp.modela', (
      ('user', self.gf('django...ForeignKey')(to=orm["%s.%s" % (User._meta.app_label, User._meta.object_name)]) 

    models = { 
     ... 
     # this should replace "auth.user" 
     "%s.%s" % (User._meta.app_label, User._meta.module_name): { 
     'Meta': {'object_name': User.__name__}, 
     } 
     "reusableapp.modela": { 
      'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['%s.%s']"% (User._meta.app_label, User._meta.object_name)}) 
     } 
    } 

이것이 최선의 해결책인지는 확실하지 않지만 django-reversion과 같은 응용 프로그램에서 사용되고 있습니다.

그러나이 솔루션은 원래 auth.User으로 시작한 다음 myapp.customuser으로 변경하면 여전히 문제가 될 수 있습니다. 이는 south가 AUTH_USER_MODEL을 자랑하지만 사용자 정의 사용자 모델의 마이그레이션이 아직 작성되지 않았기 때문입니다. 이것은 테스트 중에 발생할 수 있습니다. 남쪽의 # 1179 번 티켓이이 문제 (http://south.aeracode.org/ticket/1179)를 해결합니다.

+3

나는 남쪽 이주 디렉토리를 리팩토링하는 스크립트를 만들었습니다. 여기 : https://gist.github.com/benjaoming/5605160 – benjaoming

+0

대신에 사용자 = getattr (설정, 'AUTH_USER_MODEL', 'auth.User') ... to = orm과 같은 작업을 수행 할 수 있습니까? [User] ... 'to': orm [ '% s'] "% User? – askvictor

+0

이 솔루션은 실제로 사용자의 런타임 평가 및 해결의 어려움이 있습니다. 따라서 버전 X에서 사이트의 auth.User를 사용하고 버전 Y에서 사용자 정의 모델로 변경하면 즉시 또는 일부 마이그레이션 스크립트가 손상 될 수 있습니다. – mbargiel