数据存储查询两种实体类型,在一个共同的属性上?

时间:2014-08-12 20:48:23

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

说我有两种实体类型:

class image(db.Model):
    url = db.LinkProperty()
    date= db.DateTimeProperty()

class video(db.Model):
    url = db.LinkProperty()
    date= db.DateTimeProperty()

每个人可能都有其他一些(不重要的)属性。

我想要做的是以某种方式合并查询:

i = image.gql('ORDER BY date LIMIT 10')
v = video.gql('ORDER BY date LIMIT 10')

这样我就会留下一个GqlQuery对象,结果好像imagevideo一样。

是否可以不做类似的事情:

merged = ([a for a in i] + [b for b in v]).sort(key=lambda x: x.date)[:10]

留下一个实际的GqlQuery对象而不是一个实体列表将是一个加号,虽然我拥有后者需要的一切。

1 个答案:

答案 0 :(得分:1)

继承和不同类的唯一方法是使用PolyModel然后你的类层次结构

class Media(db.Model):
    url = db.LinkProperty()
    date= db.DateTimeProperty()

class Image(Media):
    pass

class Video(Media):
    pass 

然后在GQL中,最好是Query对象

获取所有媒体类型

 query = Media.query().order(Media.date)

获取视频

 query = Video.query().order(Video.date)

或者没有不同的课程。拥有一个Media类和一个表示媒体类型的字段。

PolyModel的文档可以在这里找到 - https://developers.google.com/appengine/docs/python/ndb/polymodelclass