zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    C/C++中0xcccccccc...
    函数指针定义
    Visual C++的DLL
    RGB
    链接指示:extern "C"
    for_each用法
    漫画 | 夜深了,程序员的电脑却没关,发生了这样的故事…
    漫画 | 小公司卧薪尝胆三年,意外拿到美团offer
    Java 可变参数
    使用程序往Neo4j导入CSV报错
  • 原文地址:https://www.cnblogs.com/ishell/p/4217284.html
Copyright © 2011-2022 走看看