Python NDB:在属性中拥有Set而不是List的最佳方法是什么?

时间:2015-05-20 15:44:55

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

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

但你如何实现这一点,这是自动的,我不考虑这个?

3 个答案:

答案 0 :(得分:2)

有三种想法:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

阅读Subclassing属性。 https://cloud.google.com/appengine/docs/python/ndb/subclassprop

我认为这是实现此类属性的正确方法,而不是_pre_put挂钩。通常来不及进行适当的验证和反馈。

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

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