2011-10-24 4 views
1

나는 key_name을 생성 할뿐 아니라 id (나는 key_name를 사용자에게 표시하고 싶지 않음) 역할을하는 다른 속성도 갖고 싶습니다. id 일 수 있습니까? 또는 id 대신 고유 값을 생성하는 방법은 무엇입니까?GAE 데이터 스토어 엔티티에 대해 key_name과 id를 동시에 사용할 수 있습니까?

나는 무엇을 할 것인가? 나는 그 ID와 부모 키 이름을 사용하여 URL을 생성 할 것이다. 사용자가이 링크를 클릭하면이 데이터 스토어 항목을 찾아 업데이트해야합니다.

다음은 현재 코드입니다. 레코드의

창조 : 기록을 얻기

item = Items.get_by_key_name(key_names=user_id, parent=person) 
    if item is None: 
    item = Items(key_name='id'+user_id, parent=person) 

:

item = Items.get_by_key_name(key_names=user_id, parent=person) 

user_id이 숨겨져 야 할 것입니다.

+0

base64로 인코딩 된 키를 직접 사용할 수 없습니까? – systempuntoout

+0

@systempuntoout, 데이터 저장소에 그대로 두지 않습니까? 나중에이 ID를 사용하여 데이터 저장소 엔터티에 따라 식별해야합니다. –

+0

네, key_name이 아닌 key (base64로 인코딩 됨)를 직접 사용하십시오 – systempuntoout

답변

3

나는 당신의 요구 사항이 명확하지 않기 때문에 아마도 잘못 될 수 있지만, 나를 위해 당신이 사용하는 뷰에 바로 키를 통과해야합니다

item.key() 

다음 컨트롤러에 키를 다시 전달할 수 쉽게 검색 주어진 엔티티 :

item = Items.get(key) 
+0

URL에이 key() 값을 사용할 수 있습니까? –

+0

예, Gae는이 목적에 가장 적합한 URL로 수정 된 Base64를 사용합니다. – systempuntoout

+0

원래의 사용자 이름을 되돌리기 위해 Base64를 디코딩 할 수는 없습니까? 그건 안전하지 않은 것 같아. 아니면 여전히 MD5로 뭔가를 할 계획입니까? –

3

엔티티는 키 이름 또는 ID 중 하나만 있습니다. 둘 다 결코 아닙니다. 하나의 ReferenceProperty로 대상 엔티티를 가리키는 엔티티를 만들고 ID로 ID를 사용할 수 있지만 사용자에게 키 이름을 공개하지 않아야하는 이유가 없어야합니다. 잘 작성된 앱은이 값에 의존해서는 안됩니다. 남은 비밀.

문자열 인코딩 키에서 키 이름 (및 키에 대한 나머지 정보)을 쉽게 추출 할 수 있습니다.

+0

Nick, 대신에'key_name = 'id'+ user_id' 대신에'key_name = '상수'+ md5 ('id'+ user_id + '-'+ parent.key().)). hexdigest()'? –

+0

'id'를 직접 정의 할 수 있습니까 (숫자일까요?). 아니면 대신'key_name'을 사용해야합니까? –

+0

@LA_ 네, 그렇게 할 수는 있습니다. 그러나 그렇게 할 때 (그리고 부모 키 이름을 포함하는 것이 더 적다) 여전히 요점은 없습니다. 고유 한 ID를 정의 할 수 있지만이를 잊어 버린 경우 자동 생성 된 ID가 사용되어 잠재적으로 자신의 엔티티를 덮어 씁니다. 가장 좋은 방법은 여전히 ​​기존 키 이름을 혼란스럽게 만들기보다는 사용하는 것입니다. –

관련 문제