Я пытаюсь имитировать unique_together
функции Джанго, но я не могу показаться, чтобы получить его прямомодели NDB: гарантировать уникальность в хранилище данных с помощью пользовательского KEY_NAME
class MyClass(ndb.Model):
name = 'name'
surname = 'surname'
phone = 'phone'
def get_unique_key(self):
return self.name + "|" + self.surname + "|" + self.phone
«Да, довольно легко» НЕ
В соответствии с принятым ответом в this post просто присвоение параметра id
в конструкторе obj было достаточно. Но я не хочу с этим справляться. В идеале я хотел бы сделать это:
object = MyClass()
object = object.custom_populating_method(form.cleaned_data)
object.id = object.get_unique_key()
object.put()
или даже лучше, место, что в _pre_put_hook
, так что id
будет установлен как последнее, что перед сохранением (и, возможно, сделать некоторые проверки, принуждая уникальность данных по хранилище данных).
Видимо, я был неправ. Единственный способ добиться этого путем взлома вида:
unique_id = "|" + form.cleaned_data['bla'] + "|" + form.cleaned_data ...
object = MyClass(id=unique_id)
который ужасно и совершенно неправильно (так как каждое изменение требований модели должно быть проверено также в представлениях). Кроме того, я бы сделал несколько уродливых звонков, чтобы получить некоторые связанные данные. Я потратил слишком много времени, возможно, на эту проблему, чтобы увидеть выход, и я действительно надеюсь, что у меня здесь что-то неясно, но я не могу найти хороший пример и правильную документацию по этому вопросу. Есть ли какие-либо намеки или опыт с чем-то похожим?
tl; dr: есть ли хороший способ достичь этого, не добавляя ненужный код в мои представления?
(Я «с помощью» Джанго и NDB игровой Модели на Datastore)
Благодаря
Вы пытались реализовать свой собственный конструктор? – dragonx
Я попытался реализовать свой собственный метод __init__ (без вызова супер конструктора) без успеха –
Вы не хотите переопределять init, если вы действительно не знаете, что делаете. Используйте фабрику (метод класса) для создания объекта, создающего ключ, до создания объекта. См. Удар для примера –