查询不是没有

时间:2010-08-25 17:20:06

标签: python google-app-engine

我有一个带引用属性的模型,例如:

class Data(db.Model):
    x = db.IntegerProperty()

class Details(db.Model):
    data = db.ReferenceProperty(reference_class = Data)

数据引用可以是None。

我想获取所有具有有效数据的Details实体,即引用属性不是None。

以下作品:

Details.all().filter('data !=', None).fetch(1000)

但是,根据documentation on queries!=查询实际上会执行两个查询,在这种情况下似乎没有必要。 !=是否已优化为仅在与None一起使用时执行一个查询?

或者,this post提到NULL总是在有效值之前排序。因此,以下似乎也有效:

Details.all().filter('data >', None).fetch(1000)

虽然这只会进行一次查询,但使用>代替!=会使其意图不那么明显。

作为第三种选择,我可以在模型中添加一个额外的字段:

class Details(db.Model):
    data = db.ReferenceProperty(reference_class = Data)
    has_data = db.BooleanProperty()

只要我将has_data与数据保持同步,我就可以:

Details.all().filter('has_data =', True).fetch(1000)

哪种方式最好?

感谢。

1 个答案:

答案 0 :(得分:3)

我建议你使用额外的模型字段。这更灵活,因为它还允许您查询没有数据引用的详细信息。此外,查询只能有一个不等式过滤器,因此最好将此不等式过滤器保存为不等式更有意义的另一个属性,例如整数属性。

要确保标志始终更新,您可以向详细信息添加便利功能,如下所示:

class Details(db.Model):
    data = db.ReferenceProperty(reference_class=Data)
    has_data = db.BooleanProperty(default=False)

    def add_data(self, data):
        """ Adds data"""
        if not data: return
        self.has_data = True
        self.data = data
        return self.put()