在django中过滤ManyToMany字段的结果

时间:2010-11-25 15:35:51

标签: django many-to-many

嗨我在django对象上有很多2个字段,

Foo< =>杆

所以如果我按照Foo.objects.filter(bar_ name _contains ='x')过滤 我希望得到所有Foo对象与相关Bar对象的名称包含x,

所以在模板中我循环圆形Foos,然后圆形foos条,但我得到那个foo的所有条,而不仅仅是过滤器过滤的那些!

任何帮助表示赞赏


更新了一些示例代码,为了简单起见,可以使用同一个问题。

Models.py

class Foo(models.Model):  
    bob = models.CharField(max_length=255)  

class Bar(models.Model):  
    wibble = models.CharField(max_length=255)  
    foos   = models.ForeignKey('Foo')

所以在上面提到的对象中,我说的是......

foobar = Foo.objects.filter(bob__wibble__icontains='blagh')

我将传递给一个用于渲染的模板,我希望所有的foos都有一个与查询匹配的条形图,并且只有与查询匹配的条形图但是我没有得到它,我得到了所有的foos与一个匹配的条形图查询和每个具有该foo的bar作为其Foriegn Key。

即。我有一个foo我有酒吧[{'wibble':'blagh'},{'wibble':'blob'},{'wibble':twip'}]

我的模板中有以下内容:

{% for bar in foobar.bar_set.all %}
    {{ bar.wibble }},
{% endfor %}

而不仅仅是'blagh',我会得到'blagh,blob,twip'

1 个答案:

答案 0 :(得分:2)

您没有显示任何代码,但看起来您正在过滤Foo,而不是Bar。因此,您可以获得所有在其条形列表中都有一个名为“x”的条形图的Foos,但是您没有做任何事情来将条形本身限制为包含x的条形图。

您可能希望以相反的方式执行此操作:在Bar上使用过滤器表达式仅获取name ='x'的那些,然后遍历相关Foos列表。

评论后修改您仍然需要过滤条形图,而不是过滤条件。迭代时,您可以在模板中进行分组。例如:

bars = Bar.objects.filter(wibble__icontains='blagh').order_by('foo').select_related()

{% for bar in bars %}
    {% ifchanged bar.foo %}{{ bar.foo.bob }}{% endifchanged %}
    {{ bar.wibble }},
{% endfor %}