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')