【问题标题】:Query for model by key按键查询模型
【发布时间】:2010-03-26 03:39:29
【问题描述】:

我想要做的是在数据存储中查询一个模型,其中键是不是我已经拥有的对象的键。这是一些代码:

class User(db.Model):
    partner = db.SelfReferenceProperty()

def text_message(self, msg):
    user = User.get_or_insert(msg.sender)

    if not user.partner:
        # user doesn't have a partner, find them one
        # BUG: this line returns 'user' himself... :(
        other = db.Query(User).filter('partner =', None).get()
        if other:
            # connect users
        else:
            # no one to connect to!

我们的想法是找到另一个没有合作伙伴的User,这不是我们已经认识的用户。

我已经尝试了filter('key !=, user.key())filter('__key__ !=, user.key()) 和其他几个,但没有任何结果返回另一个没有伴侣的Userfilter('foo !=, user.key()) 也没有返回任何内容。

【问题讨论】:

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


    【解决方案1】:

    有一个非常简单的方法可以解决这个问题:检索两条记录,并过滤掉用户自己的记录(如果存在)。

    def text_message(self, msg):
        user = User.get_or_insert(msg.sender)
    
        if not user.partner:
            # user doesn't have a partner, find them one
            other = db.Query(User).filter('partner =', None).fetch(2)
            other = [u for u in other if u.key() != user.key()]
            if other:
                # connect user with other[0]
            else:
                # no one to connect to!
    

    【讨论】:

    • 我想过这个,它肯定会工作,但它看起来像一个黑客。难道不能只在查询中按键过滤吗?
    • 有可能,而且您的查询应该可以工作 - 如果没有更多详细信息,我无法告诉您为什么不可以。但是,它们的效率也大大低于这种方法:!= 查询需要执行两个底层查询,这有点生硬,只是为了从结果集中消除单个结果。
    • 哦,那么取两个实际上更好?有趣的。如果你好奇,这是我的代码:gist.github.com/344873
    • 是的,获取两个肯定比两个单独的查询要好。这也是 crowdguru 示例应用所采用的方法:code.google.com/p/google-app-engine-samples/source/browse/trunk/…
    猜你喜欢
    • 2020-12-20
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多