如何按ReferenceProperty的模型名称过滤?

时间:2011-05-10 09:26:26

标签: python google-app-engine google-cloud-datastore

我有以下3个班级:

class Locality(db.Model):
  location = db.ReferenceProperty()

class Organisation(db.Model):
  locality = db.ReferenceProperty(Locality)

class Position(db.Model):
  locality = db.ReferenceProperty(Locality)

Locality.location属性是对Organization或Position对象的引用。 我需要按地点过滤并获取所有参考组织的条目。

我已经尝试了,但它不起作用:

Locality.all().filter("location =",Organisation)

任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:1)

在这一行:

Locality.all().filter("location =", Organisation)

你应该传入一个组织实例而不是类本身,例如:

org = Organisation.get(some_org_key)
Locality.all().filter("location =", org)

答案 1 :(得分:0)

class Locality(db.Model):
  location = db.ReferenceProperty()

class Organisation(db.Model):
  locality = db.ReferenceProperty(Locality,collection_name='org')

class Position(db.Model):
  locality = db.ReferenceProperty(Locality,collection_name='pos')

现在每个地方对象都有一个loc属性,它只是一个Organization的集合。

要了解有关建模的更多信息,请参阅此blog

答案 2 :(得分:0)

我更喜欢阿卜杜勒的做法而不是德鲁的回答(尽管他正确地回答了你的具体问题)。我不知道这里所有的活动部件,但我怀疑你想要对它进行一些不同的建模,可能使用PolyModel,以及一些去标准化。我的意思是只看这四个类的关系,我看到很多退化只是为了简单的查询。

答案 3 :(得分:0)

最后,我找到了基于PolyModels的解决方案:

class Locality(polymodel.PolyModel):
  { geo properties here }

class Organisation(Locality):
  title = db.StringProperty()

class Position(Locality):
  title = db.StringProperty()

要按地理属性过滤所有组织:

Organisation.all().filter({by geo properties of Locality model})

要按地理属性过滤所有地区(组织+职位):

Locality.all().filter({by geo properties of Locality model})

我想,我最初的解释非常清楚。对不起。谢谢大家,感谢您的建议。它们非常有用。