django - Ndb 型号 : assure uniqueness in datastore using custom key_name

标签 django google-app-engine app-engine-ndb

我正在尝试模仿 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/

相关文章:

python - 使用 django 的站点菜单

google-app-engine - Google App Engine Flexible 和 Google Container Engine 之间的区别?

python - isinstance 不适用于 AppEngine 中的 Decimal

python - formset、inlineformset_Factory 和 kwargs

python - Django 我们如何使用应用程序名称目录和todaydate.log 文件生成应用程序明智日志

python - 在 Google App Engine 上使用 flask-login

google-app-engine - 维护 NDB 数据库中属性的唯一性

google-app-engine - modelname_set 的 Google App Engine ndb 等价物(反向引用属性)

python - Django 复选框问题

node.js - Google Datastore 部分字符串匹配