我有一个带引用属性的模型,例如:
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)
哪种方式最好?
感谢。
答案 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()