Question

in my models there are two classes:

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)

I am trying to retrieve (a) one page to view, and (b) all other pages that belong to the same categories in which that page belongs to in order to list them, too.

This is what I am doing (which is wrong):

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

I always get a 'ManyRelatedManager' object is not iterable

How it should be done?

Was it helpful?

Solution

page.categories is a ManyRelatedManager and not a list of categories (which is required for __in check). So you need to specify page.categories.all() to __in filter.

Your query changes to :

pages = Page.objects.filter(displayable=True, 
        categories__in=page.categories.all()).
        exclude(pk=page.id).order_by('-timestamp')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top