栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Google App Engine中为模型定义唯一属性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Google App Engine中为模型定义唯一属性?

没有用于确保值唯一的内置约束。您可以执行以下操作:

query = MyModel.all(keys_only=True).filter('unique_property', value_to_be_used)entity = query.get()if entity:    raise Exception('unique_property must have a unique value!')

我使用

keys_only=True
它是因为它不会通过获取实体数据来稍微提高性能。

一种更有效的方法是使用没有字段的单独模型,其键名由属性名+值组成。然后,您可以

get_by_key_name
用来获取这些组合键名称中的一个或多个,如果获得一个或多个非
None
值,则说明存在重复值(并检查哪些值不是
None
,您将知道哪些不是唯一的)。


正如 评论中一个人 提到的那样,这些方法(先行先行, 后继性质)会引发
风险并发问题。从理论上讲,可以在检查现有值之后立即创建一个实体,然后仍然执行检查后的代码,从而导致值重复。为防止这种情况,您将必须使用事务:事务-
Google App
Engine



如果要检查 所有 带有事务的实体之间的唯一性,则必须使用第一种方法将它们全部放在同一个组中,这样效率很低。对于事务,请使用如下第二种方法:

class UniqueConstraint(db.Model):    @classmethod    def check(cls, model, **values):        # Create a pseudo-key for use as an entity group.        parent = db.Key.from_path(model.kind(), 'unique-values')        # Build a list of key names to test.        key_names = []        for key in values: key_names.append('%s:%s' % (key, values[key]))        def txn(): result = cls.get_by_key_name(key_names, parent) for test in result:     if test: return False for key_name in key_names:     uc = cls(key_name=key_name, parent=parent)     uc.put() return True        return db.run_in_transaction(txn)

UniqueConstraint.check(...)
将假设每个键/值对必须唯一才能返回成功。事务将为每种模型类型使用单个实体组。这样,一次交易对于多个不同的字段都是可靠的(对于一个字段,这将更加简单。)而且,即使您在一个或多个模型中拥有相同名称的字段,它们也不会与彼此。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624234.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号