• Django查询的琐碎记录


    我的需求是这样的,获取指定用户的获“赞”总数。

    用户 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

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

  • 相关阅读:
    sql语句性能优化
    Windows版Redis如何使用?(单机)
    redis在项目中的使用(单机版、集群版)
    在windows上搭建redis集群(redis-cluster)
    Jenkins打包Maven项目
    numpy交换列
    Linq中join多字段匹配
    SpringMVC Web项目升级为Springboot项目(二)
    SpringMVC Web项目升级为Springboot项目(一)
    springboot读取application.properties中自定义配置
  • 原文地址:https://www.cnblogs.com/ishell/p/4217284.html
Copyright © 2020-2023  润新知