Джанго - Определение переменной в вспомогательной функции модели?
Это мой models.py (я создаю форум):
class Post(models.Model): #users can make a post
user = models.ForeignKey(User)
actualPost = models.CharField(max_length=200)
class PostReply(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post) #each post can have multiple replies
replyTo = models.ForeignKey("self", blank=True, null=True) #each reply can also have multiple replies.
#If replyTo = None, then the reply is a direct reply to the post
#If the user is replying to an existing reply, then replyTo will link to the reply which the user is replying to
actualReply = models.CharField(max_length=200)
replyCounter = models.IntegerField(default=0)
Допустим, пользователь создает пост. Кто-то отвечает на сообщение (в основном, объект PostReply будет создан, где replyTo = None - ответ направлен на сообщение). Если кто-то отвечает на ответ, то будет создан объект PostReply, где replyTo = ответ, направленный на сообщение.
Мне нужно дать каждому ответу счетчик. Если ответ является прямым ответом на сообщение (replyTo=None), ему присваивается счетчик 0. Если это ответ на ответ, ему присваивается счетчик 1. Если это ответ на ответ на ответ, ему дается счетчик 2 и т. д.
Это вспомогательная функция, которую я создал для PostReply:
def get_replyCount(self):
if self.replyTo: #if the reply is a reply to another reply (and not a direct reply to the post)
while self.replyTo != None:
self = self.replyTo
replyCounter += 1
get_replyCount(self)
return replyCounter
else:
return None
Теперь, если переменная с именем 'reply' (которая является объектом PostReply) передается в шаблон и в шаблон, если я это сделаю
{{ reply.get_replyCount }}
это дает мне
UnboundLocalError at /urlWhichITriedToAccess/
local variable 'replyCounter' referenced before assignment
Как мне объявить переменную для вспомогательной функции моей модели? Я попытался сделать это поле в модели, но это не сработало. Я также пытался объявить это в начале models.py, но это не сработало (по понятным причинам мне нужна одна переменная для каждого экземпляра PostReply).
1 ответ
Попробуйте какую-нибудь рекурсивную функцию вроде
def get_replyCount(self):
if self.replyTo: #if the reply is a reply to another reply (and not a direct reply to the post)
replyCounter = 0
while self.replyTo != None:
self = self.replyTo
replyCounter += get_replyCount(self) +1
return replyCounter
else:
return 1
Это должно работать, верните правильное количество ответов. Если существует более одного ответа, он будет перебирать этот список и добавлять "1" для каждого объекта до конца списка. Если существует только один ответ (или для последнего элемента), он перейдет к условию else и вернет 1, если счетчик равен по крайней мере 1. Но поскольку вы вызываете эту функцию только в ответах, она всегда будет иметь минимум 1.