Джанго - Определение переменной в вспомогательной функции модели?

Это мой 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.

Другие вопросы по тегам