gae модель get_by_id() против get_by_key_name()

#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. О, действительно? Я проверил документацию и не нашел никаких упоминаний об этом, но это полезно знать. Спасибо.