我想构建一个聊天应用程序,这是我的模型:
class Message(ndb.Model):
senderId = ndb.IntegerProperty()
receiverId = ndb.IntegerProperty()
sender_receiver = ndb.ComputedProperty(lambda self: self.senderId.join('-').join(self.receiverId))
message = ndb.StringProperty()
date = ndb.DateTimeProperty(auto_now_add=True)
所以,如果我想使用以下值将消息传递给userId1和userId2:userId1 = 7878,userId2 = 5264。 我将运行以下查询:
qry = Message.query(Message.sender_receiver.IN('7878-5264','5264-7878'));
但没有计算属性:
qry = Message.query(Message.sender.IN(7878,5264) AND Message.receiver.IN(7878,5264));
哪个更好?
答案 0 :(得分:1)
脱离我的头脑(和Dmitry所说的一样),In是一个昂贵且缓慢的操作,因为它会创建多个查询然后加入结果。
我会使用计算属性,但我甚至不会在其中使用IN。
我会做
qry = Message.query(Message.sender_receiver = '7878-5264' OR Message.sender_receiver = '5264-7878');
计算属性在执行保存时会花费更多时间,但这是一个正常情况,需要花费更多时间进行保存,以便更快地检索。
答案 1 :(得分:1)
使用重复属性。
sender_receiver = ndb.ComputedProperty(lambda self: [self.senderId, self.receiverId], repeated=True)
qry = Message.query()
qry = qry.filter(Message.sender_receiver == 7878)
qry = qry.filter(Message.sender_receiver == 5264)
# you will get all values where sender or receiver in 7878 or 5264 with a single query