当前位置: 首页 > 面试题库 >

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

时旭东
2023-03-14
问题内容

我需要一些属性是唯一的。我该如何实现?

有类似的东西unique=True吗?

我正在使用Google App Engine for Python。


问题答案:

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

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



 类似资料:
  • 一个具有“姓名”、“地址”和“工资”属性的实体“人” 两个角色-“员工”和“经理” 虽然员工应该能够编辑他自己的地址,但他肯定不能改变他的工资或其他人的地址。虽然他可能被允许看到自己的工资和其他用户的地址,但他甚至不允许看到其他人的工资,更不用说编辑了。另一方面,manager具有完全的readwrite权限。 这在后端不是问题--我们可以在那里使用自定义bean验证来强制执行写权限。 我想收到

  • 模型和一些关联具有一个或多个属性,每个属性有类型以及一些可选设置,你可以自行选择它们(或使用默认设置)。 类型 受支持的类型是: text:文本字符串; number:浮点数。你可以指定size为2 | 4 | 8; integer:整数。你可以指定size为2 | 4 | 8; boolean:true或false的值; date:日期对象。你可以指定time为true; enum:一个备选列表

  • 有没有可能通过使用属性在Laravel模型上延迟加载自定义属性,而不必每次都加载它?我正在寻找一种类似于你们可以懒散地加载雄辩的关系的方式。 例如,给定模型上的这个访问器方法: 我希望能够做这样的事情: 这个问题与在加载时向Laravel/Elount模型添加自定义属性不同吗?因为它希望在每次模型加载时加载一个自定义属性,所以我希望仅在指定时延迟加载该属性。 我想我可以为模型实例分配一个与自定义属

  • 问题内容: 有没有一种方法可以将几个字段定义为Django中唯一的字段? 我有一张(期刊的)卷表,而我不希望同一期刊有一个以上的卷号。 我试图将属性放在字段中但是它不起作用。 问题答案: 有一个简单的解决方案称为unique_together,它可以完全满足你的要求。 例如: 在你的情况下:

  • 比方上面的类型,如果我想要 value 的类型在type为 'string' 时为 string ,在 type 为 'number' 的时候为 number。 要怎么定义这两个属性之间的类型约束?

  • 我有一个ASP。NET核心Web APIendpoint,它接受(FromBody)下面定义的搜索对象 因此...如果我将以下JSON发布到我的endpoint {“pageSize”:10,“query”:{“fieldId”:“body”,“value”:“cake”,“operator”:“matches”} 我成功地获取了一个搜索对象,但查询属性的类型是Expression,而不是Matc