【问题标题】:Django counting related objects in model layerDjango在模型层计算相关对象
【发布时间】:2011-05-11 15:06:26
【问题描述】:

可以做这样的事情:

class Book(models.Model):
    voters = models.ManyToManyField(User, blank=True)
    vote = models.IntegerField() # summary of all votes
    def average_vote(self):
        return int(vote/self.annotate(Count('voters')))

【问题讨论】:

    标签: django average vote


    【解决方案1】:

    也许是这样的?

    class Book(models.Model):
        voters = models.ManyToManyField(User, blank=True)
        vote = models.IntegerField() # summary of all votes
    
        def average_vote(self):
            return int(self.vote/self.voters.all().count())
    

    让我知道这是否有效。我没有测试过。

    【讨论】:

    • 我会试试这个,但我需要在代码中做其他事情才能检查所有内容。但我回答你。
    【解决方案2】:

    只需覆盖默认管理器,使其始终返回带注释的查询集:

    class BookUserManager(models.Manager):
        def get_query_set(self, *args, **kwargs):
            return super(BookUserManager, self).get_query_set(*args, **kwargs).annotate(average_vote=models.Avg('books__vote'))
    
    class BookUser(User):
        objects = BookUserManager()
    
        class Meta:
            proxy = True
    
    class Book(models.Model):
        # Next line has been changed to use proxy model. This *will* affect the m2m table name.
        voters = models.ManyToManyField(BookUser, blank=True, related_name='books')
        vote = models.IntegerField() # summary of all votes
    
        objects = BookManager()
    

    然后,您可以像获取用户模型上的任何其他属性一样获取该值:

    user = BookUser.objects.get(username='joe')
    print user.average_vote
    

    更新:抱歉……全都搞错了。这就是我过快阅读问题所得到的。您实际上需要注释User 而不是Book,但由于User 来自django.contrib.auth(我假设)这是不可能的,或者至少它需要更多步骤。上面的代码已经更新。

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2011-01-15
      • 2012-07-21
      • 1970-01-01
      相关资源
      最近更新 更多