Django查询的琐碎记录-创新互联

我的需求是这样的,获取指定用户的获“赞”总数。Django查询的琐碎记录

用户 models.py

创新互联专注于企业成都全网营销推广、网站重做改版、德令哈网站定制设计、自适应品牌网站建设、H5网站设计电子商务商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为德令哈等各大城市提供网站开发制作服务。
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

这样,在模板中,无论是话题还是回复,简单的套一下就都可以方便的使用这个方法获取用户赞数了。


网站标题:Django查询的琐碎记录-创新互联
浏览路径:http://scyanting.com/article/dodsdo.html