没有用于确保值唯一的内置约束。您可以执行以下 *** 作:
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(...)将假设每个键/值对必须唯一才能返回成功。事务将为每种模型类型使用单个实体组。这样,一次交易对于多个不同的字段都是可靠的(对于一个字段,这将更加简单。)而且,即使您在一个或多个模型中拥有相同名称的字段,它们也不会与彼此。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)