首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我执行聚合查询时,Django模型管理器不能处理相关对象

当我执行聚合查询时,Django模型管理器不能处理相关对象
EN

Stack Overflow用户
提问于 2010-04-14 15:27:12
回答 1查看 514关注 0票数 1

在多对多相关字段上执行聚合查询时遇到问题。

以下是我的模型:

代码语言:javascript
复制
class SortedTagManager(models.Manager):
    use_for_related_fields = True

    def get_query_set(self):
        orig_query_set = super(SortedTagManager, self).get_query_set()
        # FIXME `used` is wrongly counted
        return orig_query_set.distinct().annotate(
                    used=models.Count('users')).order_by('-used')


class Tag(models.Model):
    content = models.CharField(max_length=32, unique=True)
    creator = models.ForeignKey(User, related_name='tags_i_created')
    users = models.ManyToManyField(User, through='TaggedNote',
                                   related_name='tags_i_used')

    objects_sorted_by_used = SortedTagManager()

class TaggedNote(models.Model):
    """Association table of both (Tag , Note) and (Tag, User)"""
    note = models.ForeignKey(Note) # Note is what's tagged in my app
    tag = models.ForeignKey(Tag)
    tagged_by = models.ForeignKey(User)

    class Meta:
        unique_together = (('note', 'tag'),)

但是,只有在直接查询模型时,聚合字段used的值才是正确的:

代码语言:javascript
复制
for t in Tag.objects.all(): print t.used # this works correctly

for t in user.tags_i_used.all(): print t.used #prints n^2 when it should give n

你能告诉我它出了什么问题吗?提前谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2010-04-14 20:13:03

我已经找出了问题所在,以及现在如何修复它:)

Django文档中所述的

Django将类中定义的第一个管理器解释为“默认”管理器,

的几个部分将专门为该模型使用该管理器。

在我的例子中,我应该确保SortedTagManager是第一个定义的Manager

2.我应该计算notes而不是users

代码语言:javascript
复制
Count('notes', distinct=True)
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2635587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档