【问题标题】:Filter results of ManyToMany field in django在django中过滤ManyToMany字段的结果
【发布时间】:2011-05-15 18:53:09
【问题描述】:

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

Foo 酒吧

所以,如果我按 Foo.objects.filter(bar_name_contains='x') 之类的东西过滤 我希望得到所有 Foo 对象与相关 Bar 对象的名称包含 x,

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

任何帮助表示赞赏


更新了一些示例代码,为简单起见,可能会出现同样的问题..

模型.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 与一个与查询匹配的条形查询 AND 具有该 foo 作为其外键的每个栏。

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

我的模板中有以下内容:

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

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

【问题讨论】:

  • 能否提供一些代码?
  • 你想在模板中做一个过滤器吗??

标签: django many-to-many


【解决方案1】:

您没有显示任何代码,但看起来您正在过滤 Foo,而不是 Bar。因此,您会在其 bar 列表中找到所有拥有名为“x”的 Bar 的 Foos,但您不会做任何事情来将 Bars 本身限制为包含 x 的 Bars。

您可能想反过来做:在 Bar 上使用过滤器表达式以仅获取 name='x' 的那些,然后遍历相关 Foo 的列表。

评论后编辑您仍然需要过滤 Bars,而不是 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 %}

【讨论】:

  • 我需要按 Foos 分组,而不是 bar,我需要有 bar 匹配的 foo,然后为每个 foo 输出匹配的 bar。所以我想获取所有这些数据而不需要对 SQL 进行任何处理,肯定需要几分钟的时间来处理 SQL 并将其放置在 dicts / 动态对象中,但这否定了使用 Django 对象的全部意义..
  • 针对您的评论,我添加了更多解释。
  • 感谢您的帮助,但我对此不以为然,因为我实际上是动态构建过滤器,并且会在 foo.bar、foo.bob、foo 上过滤多个多对一。弗雷德和他们每个人都需要受到限制。 ,我想我会再次绕过 django 对象。我对他们的想法如此糟糕感到震惊。
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多