Фильтровать результаты поля ManyToMany в Django - PullRequest
0 голосов
/ 25 ноября 2010

Привет, у меня есть поле много-много-много на объекте django,

Foo <=> Bar

, поэтому, если я фильтрую что-то вроде 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 является ключом Foriegn.

то есть у меня для одного фу у меня есть бары [{'wibble': 'blagh'}, {'wibble': 'blob'}, {'wibble': twip '}]

У меня есть следующее в моем шаблоне:

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

вместо того, чтобы просто получить "бла", я бы получил "бла, блоб, твип"

1 Ответ

2 голосов
/ 25 ноября 2010

Вы не показали никакого кода, но похоже, что вы фильтруете Foo, а не Bar. Таким образом, вы получаете всех Foos, у которых есть столбец с именем «x» в их списке баров, но вы ничего не делаете, чтобы ограничить сами бары теми, которые содержат x.

Возможно, вы захотите сделать это наоборот: используйте выражение фильтра на Bar, чтобы получить только те, где name = 'x', а затем выполните итерацию по списку связанных Foos.

Редактировать после комментария Вам все еще нужно фильтровать столбцы, а не 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...