我正在尝试模仿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
param即可。但我不想在视图中处理这个问题。理想情况下,我会这样做:
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 :有没有一种很好的方法来实现这一点,而不会在我的视图中添加不必要的代码?
(我在数据存储区“使用”Django和ndb的模型)
由于
答案 0 :(得分:2)
使用工厂或类方法构造实例。
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)
通过这种方式,您还可以确保密钥在密钥中的创建是唯一的,并且首先要获取密钥。
答案 1 :(得分:0)
如果您分配整个key
,而不仅仅是id
,我认为您可以这样做:
object = MyClass()
object = object.custom_populating_method(form.cleaned_data)
object.key = ndb.Key(MyClass, object.get_unique_key())
object.put()