2014-07-23 1 views
0

여기 거래가 있습니다. 당신이 이해 수 있으므로 모델의 나머지 UUIDModel을 상속 모든 사람이 행복하게 살고, 잘Django 덮어 쓰기 모델에서 UUID는 pk로

class UUIDField(CharField): 

    def __init__(self, *args, **kwargs): 
     kwargs['max_length'] = kwargs.get('max_length', 22) 
     # kwargs['blank'] = True 
     kwargs['default'] = lambda: uuid.uuid1().bytes.encode('base64').rstrip('=\n').replace('/', '_') 
     CharField.__init__(self, *args, **kwargs) 

class UUIDModel(models.Model): 

    uuid = UUIDField(primary_key=True, max_length=22, editable=False) 

: 그것은이 방법을 수행 할 때, 일했다. 문제는 Django 마이그레이션 기능 (및 그 문제에 대해서는 South)이 lambdas와 잘 어울리지 않는다는 것입니다.

class UUIDField(CharField): 

    def _gen_uuid(self): 
     return uuid.uuid1().bytes.encode('base64').rstrip('=\n').replace('/', '_') 

    def __init__(self, *args, **kwargs): 
     kwargs['max_length'] = kwargs.get('max_length', 22) 
     # kwargs['blank'] = True 
     kwargs['default'] = self._gen_uuid() 
     CharField.__init__(self, *args, **kwargs) 

합법적 인 것 같다,하지만 지금은 모델을 덮어 얻을 즉, UUID가 변경되지 않습니다이며, 모든 새 모델은 같은 PK에 기록됩니다, 다음은 람다를 해결하려고 걸릴 내입니다. 결과적으로 나는 하나 이상의 인스턴스를 작성할 수 없습니다. 내가 잘못한 곳? 람다는 무엇을합니까? 내 코드는 그렇지 않습니다. 가장 중요한 것은 그것이 어떻게 고칠 수 있는가?

+0

람다를 사용하여 * 해결했습니다. 그게 뭐가 잘못 됐어? –

+1

주의 : lambda 문은 함수 객체를 생성하므로 첫 번째 코드에서 kwargs [ 'default']'는 함수 객체 (호출 가능)이고 두 번째 예제에서는 함수 호출'self._gen_uuid() '를 할당합니다. 'kwargs [ 'default']'는 값이며 함수 객체가 아님을 의미합니다. 그것은 당신의 예들 사이의 차이입니다. 그리고 모든 인스턴스에 대해 동일한 uuid를 얻는 이유입니다. 원래 문제는 다음을 확인하십시오. http://south.aeracode.org/ticket/1243 및 http://stackoverflow.com/questions/15041265/south-migrate-error-name-uuid-is-not 정의 됨. –

+0

@DanielRoseman은 db 마이그레이션 모듈에 내장되어있어 lambdas를 지원하지 않습니다. 따라서 자동 마이그레이션을 수행 할 수 없습니다. – wswld

답변

0

@pavel_form의 의견은 내 문제의 근원을 이해하는 데 도움이되었습니다. 호출 가능 코드를 전달하면 다음과 같이 고정 된 것으로 보입니다.

class UUIDField(CharField): 

    def _gen_uuid(self): 
     return uuid.uuid1().bytes.encode('base64').rstrip('=\n').replace('/', '_') 

    def __init__(self, *args, **kwargs): 
     kwargs['max_length'] = kwargs.get('max_length', 22) 
     # kwargs['blank'] = True 
     kwargs['default'] = self._gen_uuid 
     CharField.__init__(self, *args, **kwargs) 

그래도 마이그레이션 문제는 여전히 상당 부분 발생합니다. South migrate error: name 'UUID' is not defined (@ pavel-form에 의해 제안 됨)은 특별 UUIDFIeld의 정의를 생략하고 더 나아가 마이그레이션과 함께 잘 작동한다고 여겨집니다. 나는 그 방향을보고있을 것이다.

관련 문제