我正在尝试模仿 Django 的 unique_together
功能,但我似乎无法直接理解
class MyClass(ndb.Model):
name = 'name'
surname = 'surname'
phone = 'phone'
def get_unique_key(self):
return self.name + "|" + self.surname + "|" + self.phone
“是的,很简单”不
根据this post中接受的答案,只需在 obj 构造函数中分配 id 参数就足够了。但我不想在 View 中处理这个问题。理想情况下,我会这样做:
object = MyClass()
object = object.custom_populating_method(form.cleaned_data)
object.id = object.get_unique_key()
object.put()
或者更好的是,将其放在 _pre_put_hook
中,以便将 id
设置为保存之前的最后一件事(并且可能会进行一些检查以强制执行该 ID 的唯一性)数据存储中的数据)。
显然我错了。实现此目的的唯一方法是破解 View :
unique_id = "|" + form.cleaned_data['bla'] + "|" + form.cleaned_data ...
object = MyClass(id=unique_id)
这是可怕的并且完全错误的(因为模型需求的每一个更改都需要在 View 中进行检查)。另外,我最终会进行一些丑陋的调用来获取一些相关数据。 我可能在这个问题上花了太多时间来查看退出,我真的希望我在这里错过了一些明显的东西,但我真的找不到任何关于这个主题的好的例子或适当的文档。有没有人有类似的提示或经验?
tl;dr:有没有一种好的方法可以实现这一目标,而不需要在我的 View 中添加不必要的代码?
(我在数据存储上“使用”Django 和 ndb 的模型)
谢谢
最佳答案
使用工厂或类方法来构造实例。
class MyClass(ndb.Model):
name = ndb.StringProperty()
surname = ndb.StringProperty()
phone = ndb.StringProperty()
@staticmethod
def get_unique_key(name,surname,phone):
return '|'.join((name,surname,phone))
@classmethod
@transactional
def create_entity(cls,keyname,name,surname,phone):
key = ndb.Key(cls, cls.get_uniquekey())
ent = key.get()
if ent:
raise SomeDuplicateError()
else:
ent = cls(key=key, name=name,surname=surname,phone=phone)
ent.put()
newobj = MyClass.create_entity(somename, somesurname, somephone)
这样做还可以让您通过创建 key 并首先尝试获取它来确保 key 是唯一的。
关于django - Ndb 型号 : assure uniqueness in datastore using custom key_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705728/