django фильтр по ManyToManyField другого объекта

В моих моделях есть два класса:

class PageCategory(models.Model):
    name = models.CharField(max_length=256)
    slug = models.CharField(max_length=256, default='')

class Page(models.Model):
    title = models.CharField(max_length=256)
    slug = models.CharField(max_length=256)
    categories = models.ManyToManyField(PageCategory, related_name='page_categories', null=True, blank=True)

Я пытаюсь получить (а) одну страницу для просмотра и (б) все другие страницы, которые принадлежат к тем же категориям, к которым относится эта страница, для их перечисления.

Это то, что я делаю (что неправильно):

def pageView(request, page_slug):
    page = get_object_or_404(Page, slug=unicode(page_slug))
    pages = Page.objects.filter(displayable=True, categories__in=page.categories).exclude(pk=page.id).order_by('-timestamp')

Я всегда получаю 'ManyRelatedManager' object is not iterable

Как это должно быть сделано?

1 ответ

Решение

page.categories это ManyRelatedManager а не список categories (что требуется для __in проверять). Так что вам нужно указать page.categories.all() в __in фильтр.

Ваш запрос изменяется на:

pages = Page.objects.filter(displayable=True, 
        categories__in=page.categories.all()).
        exclude(pk=page.id).order_by('-timestamp')
Другие вопросы по тегам