【问题标题】:Python NDB: what's the best way to have a Set instead of a List in property?Python NDB:在属性中使用 Set 而不是 List 的最佳方法是什么?
【发布时间】:2015-08-01 23:33:16
【问题描述】:

在 NDB 中,您有重复的属性,它们的行为就像原生 python 列表,但我希望它们的行为就像原生集合。 我需要一组没有重复的键。 在 python 中,您可以删除重复项,例如 the_list = list(set(the_list)),

但是你将如何实现它,所以它是自动的,我不考虑这个?

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore data-modeling app-engine-ndb


    【解决方案1】:

    想到三种方法:

    1. 使用仅插入唯一值的“setter”方法强制列表(重复属性)是唯一的;
    2. 同样,使用_pre_put_hook() 方法强制列表是唯一的;
    3. 使用key on each entity 作为您的列表,ndb 将确保它们是唯一的。

    【讨论】:

    • 你能解释更多关于方法 3 的信息吗?以及如何实现 setter(ndb 验证器仅验证单个键而不是整个键列表)?
    • 对于数字 3,我认为您可以尝试插入一个实体,并将键作为唯一值。如果失败,则该值不唯一。
    • 我不明白。你是说 NDB 自动使 KeyProperty(repeated=True) 独一无二,就像一个集合?因为它不是来自我的测试。
    • 不,整个模型类将是集合,实体将是列表成员。
    【解决方案2】:

    另一个选择是继承ndb.Property。这里有很多例子: https://cloud.google.com/appengine/docs/python/ndb/subclassprop

    【讨论】:

    • 我没有看到符合我要求的示例,我可以覆盖属性上的设置器吗?你将如何实现它?
    【解决方案3】:

    我相信正确的策略是构建一个自定义 SetProperty,它是 ListProperty 的子类,以强制执行您的要求。

    阅读有关子类化属性的内容。 https://cloud.google.com/appengine/docs/python/ndb/subclassprop

    我相信这是实现此类属性的正确方法,而不是 _pre_put 挂钩。执行适当的验证和反馈通常为时已晚。

    您可以编写自定义 setter,但是您的 setter 不能是属性的名称,所以这看起来很奇怪。

    另一种选择是使用允许强制值的验证器。见https://cloud.google.com/appengine/docs/python/ndb/properties#options

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2017-01-19
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多