【问题标题】:App Engine Datastore join with filter on referenceApp Engine Datastore 加入过滤器参考
【发布时间】:2011-07-12 05:46:56
【问题描述】:

我对 App Engine Datastore 非常陌生,我无法弄清楚这一点。 我有这些模型:

class SomeUser(User):
        name = db.StringProperty()

class Group(db.Model):
        title = db.StringProperty()
        date_started = db.DateTimeProperty(auto_now_add=True)

class GroupParticipant(db.Model):
        group = db.ReferenceProperty(Group, collection_name = 'participants')
        participant = db.ReferenceProperty(SomeUser)
        is_owner = db.BooleanProperty()

如何查询数据存储以获得这样的结果:

Group.title, Group_owner, Number of participants/Group
group1,      someuser1,   3
group2,      someuser2,   4

【问题讨论】:

    标签: python google-app-engine gql datastore


    【解决方案1】:

    根本没有连接。您必须手动获取所有数据。例如你可以从GroupParticipant获取所有记录,然后在循环中获取所有GroupSomeUser(注意Key获取非常快)

    --

    顺便说一句,使用不同的数据结构可能会更好,比如

    class SomeUser(User):
            name = db.StringProperty()
    
    class Group(db.Model):
            title = db.StringProperty()
            date_started = db.DateTimeProperty(auto_now_add=True)
            owner = db.ReferenceProperty(SomeUser)
            participants = db.ListProperty(db.Key)
    

    在这种情况下,您只需一个查询即可获取所有需要的数据

    【讨论】:

    • 警告:这不适用于超过 5000 人的团体。
    • 是的,感谢您的留言。那个问题,但你总是可以把它分成几个块
    • 我阅读了有关数据存储非规范化技术的信息,我明白你的意思。但是如何在 ListProperty 中进行过滤?是否有 gql 或者我必须在我的程序中执行它?我需要选择用户所在的所有组(简单参与者或所有者)
    • 应该是q.filter('participants =', someUserKey),其中 someUserKey 是您要查找的用户的密钥
    • 它不适用于参与者 = db.ListProperty(SomeUser)。它给了我一个“ValueError:项目类型 SomeUser 不可接受”,所以我选择了 db.ListProperty(db.Key) ,它工作得很好。谢谢你的帮助,斯普利克斯。阅读有关 ListProperty 的文档让我和以前一样一无所知。也许你知道为什么,只是出于好奇。
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 2013-07-11
    • 2018-12-24
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多