Вопрос по – Каков наилучший способ указать имя ключа для модели App Engine NDB?

8

Я пытаюсь создать модель ndb, в которой каждая запись имеет уникальное поле «имя». Я хотел бы определить это поле как поле key_name и использовать его для поиска записей. Нужно ли включать поле имени или я могу каким-то образом установить в поле key_name произвольную строку, которую пользователь может указать, если она уникальна?

Я думаю об использовании Model.get_or_insert, чтобы удостовериться, что старые записи не перезаписываются, но есть ли способ узнать, является ли возвращаемое значение новым или уже существующим? Я хочу отображать сообщение об ошибке, если пользователь ввел повторяющееся имя.

Наконец, я попытался создать поле key_name в модели DjangoForms, которая использует вышеупомянутую модель ndb в качестве метакласса, чтобы я мог использовать djangoforms для проверки / рендеринга, но по некоторым причинам мои определенные поля не отображаются.

Класс UserProfileForm (djangoforms.ModelForm):     key_name = djangoforms.StringProperty ()     Класс Meta:         модель = UserProfile

Вы должны действительно задавать отдельные вопросы для каждого из них, а не смешивать их все вместе. Nick Johnson

Ваш Ответ

1   ответ
14

eld to an arbitrary string that the user can specify as long as it's unique?

Вы можете передать свой уникальный ключ какid параметр для конструктора модели:profile = UserProfile(id='my_unique_name').

I'm thinking of using Model.get_or_insert to make sure that old records don't get overwritten, but is there a way to tell if the return value is newly created or pre-existing? I want to be able to display an error message if the user entered a duplicate name.

использованиеModel.get_by_id(), Он вернет экземпляр модели илиNone если модель не найдена:

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

Lastly, I tried to create a key_name field on a DjangoForms model that uses the above ndb model as the metaclass so I can use djangoforms for validation/rendering but for some reason my defined fields don't show up.

Я не знаю, как работают DjangoForms, но, скорее всего, они не совместимы с NDB. Вы захотите создать свою собственную логику проверки.

@NickJohnson, что бы вы предложили? ПереопределитьModel.get_or_insert() и вызвать исключение внутри транзакции, если get part возвращает пользователя?
Я предлагаю реализовать транзакцию, которая делает именно то, что нужно - попытка получить модель; выбросить ошибку, если она существует, и создать ее, если она не существует.
Ваше решение для части 2 не будет работать, если он хочет создать пользователя транзакционно, если он еще не существует - для этого требуется транзакция.

Похожие вопросы