2012-04-18 10 views
8

Próbuję utworzyć model ndb, w którym każdy rekord ma unikatowe pole "nazwa". Chciałbym zdefiniować to pole jako pole key_name i użyć go do wyszukania rekordów. Czy muszę dołączyć pole nazwy lub czy mogę w jakiś sposób ustawić pole nazwa_klucza na dowolny ciąg znaków, który użytkownik może określić, o ile jest unikatowy?Jaki jest najlepszy sposób określenia nazwy klucza dla modelu NDB App Engine?

Zastanawiam się, czy użyć Model.get_or_insert, aby upewnić się, że stare rekordy nie zostaną nadpisane, ale czy istnieje sposób na sprawdzenie, czy wartość zwracana jest nowo utworzona lub istniejąca wcześniej? Chcę móc wyświetlać komunikat o błędzie, jeśli użytkownik wprowadził zduplikowaną nazwę.

Na koniec próbowałem utworzyć pole key_name w modelu DjangoForms, który używa powyższego modelu ndb jako metaklasu, więc mogę używać djangoforms do sprawdzania/renderowania, ale z jakiegoś powodu moje zdefiniowane pola nie pojawiają się.

klasa UserProfileForm (djangoforms.ModelForm): KEY_NAME = djangoforms.StringProperty() class Meta: Model = UserProfile

+1

Powinieneś zadać osobne pytania do każdego z nich, zamiast je wszystkie zsumować. –

Odpowiedz

14

Czy muszę zawierać pole nazwy czy mogę jakoś ustawić pole KEY_NAME do dowolnego ciągu, który użytkownik może określić, o ile jest unikatowy?

Można zdać swoją unikalną nazwę klucza jako parametr id modelowania Konstruktor: profile = UserProfile(id='my_unique_name').

mam na myśli używając Model.get_or_insert, aby upewnić się, że stare rekordy nie zostaną zastąpione, ale czy jest jakiś sposób, aby stwierdzić, czy wartość zwracana jest nowo utworzone lub istniejące wcześniej? Chcę móc wyświetlać komunikat o błędzie, jeśli użytkownik wprowadził zduplikowaną nazwę.

Użyj Model.get_by_id(). zwróci instancję modelu lub None jeśli model nie zostanie znaleziony:

profile = UserProfile.get_by_id('my_unique_name') 
if profile: 
    # display error message saying that the user already exists. 

Wreszcie, starałem się stworzyć pole KEY_NAME na modelu DjangoForms który używa tego modelu NDB jako metaklasą więc mogę używać djangoforms do sprawdzania/renderowania, ale z jakiegoś powodu moje zdefiniowane pola nie pojawiają się.

Nie wiem, jak działają DjangoForms, ale najprawdopodobniej nie są one zgodne z NDB. Będziesz chciał stworzyć własną logikę walidacji.

+1

Twoje rozwiązanie części 2 nie zadziała, jeśli chce utworzyć użytkownika transakcyjnie, jeśli jeszcze nie istnieje - do tego wymagana jest transakcja. –

+0

@NickJohnson co zasugerowałbyś? Aby zastąpić 'Model.get_or_insert()' i podnieść wyjątek wewnątrz transakcji, jeśli część zwracana zwraca użytkownika? – Maxim

+1

Proponuję implementację transakcji, która robi dokładnie to, co jest potrzebne - próba uzyskania modelu; zgłaszać błąd, jeśli istnieje, i utworzyć go, jeśli nie istnieje. –

Powiązane problemy