#python #google-app-engine
#python #google-app-engine
Вопрос:
Мне интересно получить записи с использованием Model.get_by_key_name () против Model.get_by_id()
Например, допустим, я возвращаю некоторый JSON, который будет использоваться для отображения таблицы записей, и для каждой записи есть кнопка для удаления этой записи. Предположим, у меня есть модель ‘Foo’ и экземпляр модели ‘foo’.
Я полагаю, что могу связать каждую кнопку с соответствующей записью, используя либо:
str(foo.key()) #suppose it eval's to "axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM"
или
foo.key().id() #suppose it eval's to "57"
Одно из этих значений перейдет в HTML-форму, и пользователь может нажать кнопку, которая отправляет запрос на удаление записи с этим ключом / идентификатором.
Тогда запрос привел бы к либо:
Foo.get_by_key_name("axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM").delete()
или
Foo.get_by_id(57).delete()
Теперь, будучи программистом с СДВГ, страдающим нерешительностью, которым я являюсь, мне нужно знать … какой «правильный» способ? Кажется, что они оба работают, но есть ли обстоятельства, которые делают одно предпочтительнее другого? Есть ли какое-то преимущество в использовании способа ‘key’ по сравнению с способом ‘id’?
Ответ №1:
Вы путаете имя ключа со строковым ключом. Они разные. Имя ключа — это то, что вы присваиваете сущности через зарезервированное свойство key_name во время создания. Если вы этого не сделаете, система сгенерирует идентификатор. Ключ сущности может иметь либо имя, либо идентификатор, но не оба.
Если вы намеренно преобразовали ключ в строку, вы восстанавливаете его, передавая обратно в конструктор ключей.
stringifiedKey = str(key)
reconstitutedKey = db.Key(stringifiedKey)
Предполагая, что вы действительно имели в виду имя или идентификатор, это вопрос того, что удобнее. Любая разница в производительности будет микроскопической.
Ответ №2:
То, что вы получаете, является ключевой строкой, а не key_name. Если вы хотите получить объект из его ключевой строки. Затем вы используете Model.get(keystring)
. Key_name — это то, что вы присваиваете объекту, который должен быть уникальным. Если вы считаете, что могли бы использовать любой уникальный атрибут, вы можете использовать его в качестве key_name, в противном случае используйте идентификатор, сгенерированный по умолчанию. Единственное, что вы получаете при использовании key_name, — это get_or_insert()
который возвращает объект, если объект с таким именем ключа существует, иначе он создается и возвращает его.
Комментарии:
1. На самом деле это должно быть
Model.get(db.Key(keystring))
правильно?2. Никакая функция get() также не может получить объект из ключевой строки Model.get(keystring)
3. О, действительно? Я проверил документацию и не нашел никаких упоминаний об этом, но это полезно знать. Спасибо.