Django模型实例的递归函数
我想让消息视图显示所有与某条消息相关的其他消息。原始消息不会有一个叫做response_to的值,并且应该结束这个递归过程。有没有更好的方法来实现这个?(我更关注内存使用而不是速度,因为一个讨论串通常不会超过10到20条消息)。
def get_thread(msg,msg_set=[]):
"""
This will get all the messages that led up to any particular message
it takes only a message, but if the message isn't the first message
in a thread it appends it to a message list to be returned.
the last message in the list should be the first message created
"""
if msg.response_to:
return get_thread(msg.response_to, msg_set+[msg])
return msg_set+[msg]
# Create your models here.
class Message(models.Model):
body = models.TextField()
sender = models.ForeignKey(User,related_name='sender')
recipients = models.ManyToManyField(User,related_name='recipients')
timestamp = models.DateTimeField(default=datetime.datetime.now)
response_to = models.ForeignKey(Message,related_name='response_to')
def thread(self):
return get_thread(self)
2 个回答
0
如果你想限制递归的深度,可以加一个递减的计数器:
class Message(Model):
def get_thread(self, max_length = 10):
if self.response_to:
thread = response_to.get_thread(max_length-1)
else:
thread = []
thread.append(self)
return thread
递归通常比循环要慢,而且通常会消耗更多的内存(因为你需要用一些特殊的方式来处理栈)。不过,如果你只递归到大约1000层,这也不是个大问题。
4
是的。这段代码没有使用递归。
def get_thread(msg):
messages = [] # empty message set
while msg.response_to:
messages.append(msg)
msg = msg.response_to
messages.append(msg) # will append the original message
return messages