我的需求是这样的,获取指定用户的获“赞”总数。
用户 models.py
class UserProfile(models.Model): user = models.OneToOneField(User)
话题\回复 models.py
class Reply(models.Model): content = models.TextField() author = models.ForeignKey(User) ... thanks = models.ManyToManyField(User,related_name='+')
每个reply就是一个的回复。每获得一个赞同那么thanks就多一对应关系
我想通过指定用户然后过滤出所有他的回复,然后获得他获得赞同的总数。
在views视图中我可以通过如下代码获取到一个人获得“赞”的总数
thanks_count = 0 for reply in Reply.objects.filter(author=user_profile.user): thanks_count += reply.thanks.count()
然后在reply_thanks.html模板中我使用thanks_count就可以获得获赞总数了。
------
上面的方法没多久就发现了弊端。由于在贴子界面每个用户的头像旁边也需要显示获得的赞数,多个人的话,“author=user_profile.user”这个就用不了了。
所以需要一个新的,简单,可用性高的方法。我想过在UserProfile中添加赞的属性,或是在取出的回复的地方套层循环然后获取用户。但是都感觉麻烦,而且不给力,不知道怎么具体实现。
于是,我又开始翻看模板中的代码,看能不能找到点什么。我在index.html看到了“{{item.author.get_profile.slug}}”这个东西。话题可以获取到用户,我能不能通过用户获取到他获得的thanks数呢?
答案是肯定的。
Reply和UserPrefile的联系是通过User建立的。那么在模板中使用{{ item.author.userprofile.get_user_thanks }}就可以获取到UserPrefile中的方法了。值得注意的是那个userprefile是小写的。而且如果获取到了User,那么直接就可以获取到了userprefile。
确实是又有所收获。
接下来的定义get_user_thanks就简单了。在UserProfile中增加函数即可
class UserProfile(models.Model): user = models.OneToOneField(User) def get_user_thanks(self): thanks_count = 0 for reply in Reply.objects.filter(author=self.user): thanks_count += reply.thanks.count() return thanks_count
这样,在模板中,无论是话题还是回复,简单的套一下就都可以方便的使用这个方法获取用户赞数了。