django:如何在values()中使用多对多关系?

时间:2010-12-31 18:42:33

标签: django

我需要按照原始模型需要少量连接的字段对结果进行分组:

// response_filter_args is created dynamically
responses = Response.objects.filter(**response_filter_args) \
        .values('customer__tags__tag') \                  # django doesn't like this
        .annotate(average_score=Avg('rating__score'))

回复 - >客户 - >标签(指向标签的多对多字段) - > tag(标记为字符串)

模型是:

class Response(models.Model):
    customer = models.ForeignKey(Customer)
    ...

class Customer(models.Model):
    tags = models.ManyToManyField(Tag)
    ...

class Tag(models.Model):
    tag = models.CharField(max_length=255)
    ...

我正在尝试计算平均评分。为了使它工作我需要告诉django按'标签'分组,但它拒绝。它给出了一个错误:

Invalid field name: 'customer__tags__tag'

任何人都知道如何按标签分组?我已经尝试了我能想到的customer_ 标签 _tag中所有下划线的组合,但没有任何效果。

2 个答案:

答案 0 :(得分:3)

如果您查看the Django docs for values(),您会发现只有在开发版本和not in 1.2中添加了多对多的字段支持:

  

之前[pre dev version]的values()方法没有为ManyToManyField属性返回任何内容,如果您尝试将此类型的字段传递给它,则会引发错误。

答案 1 :(得分:0)

我认为这不会起作用,因为django无法通过一个查询获得通过ManyToMany关系相关的对象。