2013-07-17 2 views
2
내가 장고의 unique_together 기능을 모방하기 위해 노력하고있어

를 사용하여 데이터 저장소에 고유성을 보장하지만 바로NDB 모델 : 사용자 정의 KEY_NAME

class MyClass(ndb.Model): 
    name = 'name' 
    surname = 'surname' 
    phone = 'phone' 

    def get_unique_key(self): 
     return self.name + "|" + self.surname + "|" + self.phone 

"그래, 아주 쉽게"

그것을하지 얻이 수없는 것

허용 된 답변 this post에 따르면 obj 생성자에서 id 매개 변수를 지정하기 만하면됩니다. 그러나 저는 그것을보기에 다루기를 원하지 않습니다. 이상적으로, 나는이 작업을 수행 할 것 다음 id 저장하기 전에 같은 마지막 설정 (그리고 아마도에서 데이터의 고유성을 시행하는 몇 가지 검사를 할 것입니다 수 있도록 더 나은

object = MyClass() 
object = object.custom_populating_method(form.cleaned_data) 
object.id = object.get_unique_key() 
object.put() 

또는를하는 _pre_put_hook에 그것을 배치 데이터 저장소).

분명히, 나는 틀 렸습니다. 이것을 달성하는 유일한 방법은보기를 해킹하는 것입니다 : 끔찍한와 (모델의 요구 사항에 대한 모든 변화의 의견도 검사 할 필요가 있기 때문에) 완전히 잘못

unique_id = "|" + form.cleaned_data['bla'] + "|" + form.cleaned_data ... 
object = MyClass(id=unique_id) 

. 게다가, 나는 몇 가지 관련 데이터를 가져 오기 위해 몇 가지 못생긴 호출을 끝낼 것입니다. 출구를보기 위해이 문제에 너무 많은 시간을 할애하여 실제로 여기에서 뭔가 분명한 것을 놓치기를 바랍니다. 그러나이 주제와 관련된 좋은 예나 적절한 문서를 찾을 수 없습니다. 어떤 힌트 또는 비슷한 경험을 가진 사람이 있습니까?

tl; dr : 내보기에 불필요한 코드를 추가하지 않고도이를 달성 할 수있는 좋은 방법이 있습니까?

덕분에 난 당신이 전체 key를 할당하는 경우 당신이 그것을 할 수 있다고 생각

+0

나만의 생성자를 구현해 보셨습니까? – dragonx

+0

잘 난 성공하지 않고 내 자신의 __init__ 메서드 (슈퍼 생성자를 호출하거나하지 않고)를 구현하려고 시도했습니다. –

+0

실제로 무엇을하고 있는지 알지 못하는 한 init을 재정의하고 싶지 않습니다. 엔터티를 만들기 전에 팩토리 (클래스 메서드)를 사용하여 키를 만드는 엔터티를 만듭니다. 예를 들어 타격을 참조하십시오. –

답변

2

인스턴스를 생성하기 위해 팩토리 또는 클래스 메소드를 사용하십시오. 이런 식으로 이렇게

class MyClass(ndb.Model): 
    name = ndb.StringProperty() 
    surname = ndb.StringProperty() 
    phone = ndb.StringProperty() 

    @staticmethod 
    def get_unique_key(name,surname,phone): 
     return '|'.join((name,surname,phone)) 

    @classmethod 
    @transactional 
    def create_entity(cls,keyname,name,surname,phone): 
     key = ndb.Key(cls, cls.get_uniquekey()) 
     ent = key.get() 
     if ent: 
      raise SomeDuplicateError() 
     else: 
      ent = cls(key=key, name=name,surname=surname,phone=phone) 
      ent.put() 

NEWOBJ = MyClass.create_entity (somename, somesurname, somephone는)

당신은 또한 키가 키를 크레아틴과 먼저 가져 트링에 의해 고유 보장 할 수 있습니다.

+0

감사합니다. –

+0

나중에 사용자의 전화 변경 사항 (예를 재사용하기 위해 사용 사례는 약간 다릅니다)을 가정 해 봅시다. 새 전화 번호를 입력합니다. 하지만 이제 키가 ndb에 저장된 데이터를 반영하지 않습니다. 누군가는 처음부터 동일한 값을 다시 추가하려고 시도합니다 (이름, 성, 전화).그 조합은 이전에 사용 되었기 때문에 실패하지만 첫 번째 전화 번호를 검색하면 아무 것도 없습니다. 이 문제를 피하기 위해 키를 삭제하고 새로운 obj를 작성하는 방법에 대해 생각했지만 다른 모델이 가지고있는 참조를 느슨하게 만들었습니다. 이 작업을 수행하는 방법에 대한 아이디어는 여전히 독창성을위한 키를 사용하고 있습니까? – alfetopito

0

(필자는 데이터 저장소에 장고와 NDB의 모델 "을 사용하여"있어) 오히려 id보다는 다만 :

object = MyClass() 
object = object.custom_populating_method(form.cleaned_data) 
object.key = ndb.Key(MyClass, object.get_unique_key()) 
object.put()