Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'RelatedManager' object is not iterable Django

Hey i have looked around through some simliar posts here on SO but havent found anything that has solved my problem. I have the following models,

from django.db import models

class Areas(models.Model):

    name =  models.CharField(max_length = 120)
    order_in_sidebar_network = models.IntegerField(blank=True, null=True)
    order_in_section_network = models.IntegerField(blank=True, null=True)


    def __unicode__ (self):
        return self.area_name

    class Meta:
        verbose_name_plural = "Areas"
        verbose_name = "Area"

class Countries(models.Model):
    name = models.CharField(max_length = 120, help_text = "The name of the country")
    area = models.ForeignKey(Areas, verbose_name = 'Area')

    def __unicode__ (self):
        return self.name

    class Meta:
        verbose_name_plural = "Countries"
        verbose_name = "Country"
        ordering = ['name']



class Offices(models.Model):
    country = models.ForeignKey(Countries, verbose_name = 'Country')
    name = models.CharField(max_length = 255, help_text = "The name of this office, IE London")
    main_office = models.BooleanField(default= False, help_text = "Is this office a key location?", verbose_name = "Key Location")
    address_1 = models.CharField(max_length = 255, null = True, blank = True)
    address_2 = models.CharField(max_length = 255, null = True, blank = True)
    address_3 = models.CharField(max_length = 255, null = True, blank = True)
    city = models.CharField(max_length = 255, null = True, blank = True)
    postcode = models.CharField(max_length = 20)
    tel = models.CharField(max_length = 30, null= True, blank = True, help_text = "Optional telephone contact number")
    mobile = models.CharField(max_length = 30, null= True, blank = True, help_text = "Optional mobile contact number")
    fax = models.CharField(max_length = 30, null= True, blank = True, help_text = "Optional fax contact number")
    data_1 = models.CharField(max_length = 255, null = True, blank = True, help_text = "Optional additional data", verbose_name = "Additional information")
    data_2 = models.CharField(max_length = 255, null = True, blank = True, help_text = "Optional additional data", verbose_name = "Additional information")

    class Meta:
        verbose_name_plural = "Offices"
        verbose_name = "Office"
        ordering = ['name']

    def __unicode__(self):
        return self.name

class OfficeMembers(models.Model):
    name = models.CharField(max_length = 60, help_text = "Please tell us this person name")
    title = models.CharField(max_length = 100, help_text = "The person's title, IE Managing Director")
    email = models.EmailField(max_length = 255, null = True, blank = True, help_text = "Optional email address for this person")
    email2 = models.EmailField(max_length = 255, null = True, blank = True, help_text = "Optional second email address for this person")
    phone = models.CharField(max_length = 30, null = True, blank  = True, help_text = "Optional contact number for this person")
    mobile = models.CharField(max_length = 30, null = True, blank  = True, help_text = "Optional mobile contact number for this person")
    office = models.ForeignKey(Offices, null = True)
    class Meta:
        verbose_name_plural = "Office Memebers"
        verbose_name = "Office memebr"
        ordering = ['name']

    def __unicode__(self):
        return self.name

i have the following view set up

def index(request):

    cache_key = "world_areas"
    cache_time = 60

    world_areas_cache = cache.get(cache_key)

    #if no cache is set, grab the objects, and set the cache

    logger.debug(world_areas)
    if not world_areas_cache:
        logger.info('No cache found grabbing objects')
        world_areas = Areas.objects.select_related().all()
        #cache.set(cache_key, world_areas, cache_time)
        logger.debug(world_areas)
    else:
        logger.info("Getting from cache")
        world_areas = world_areas_cache

    return render_to_response('network/index.html', {'world_areas':world_areas}, context_instance=RequestContext(request))

trying to iterate over the world_areas object like so

{% for area in world_areas %}

produces a template syntax error

'RelatedManager' object is not iterable

Any one got any ideas why this is happeing? really cant seem to get round this! strangley this is working for me in shell :S am i missing something obvious???

Big thanks to anyone able to help!

like image 914
Mike Waites Avatar asked Jul 15 '11 08:07

Mike Waites


2 Answers

Call all() to retrieve the elements from the manager.

{% for area in world_areas.all %}
like image 109
laffuste Avatar answered Oct 13 '22 19:10

laffuste


In general, it is better practice to use a values or values_list to pass data from a queryset to a template.

world_areas = Areas.objects.select_related().all().values_list('name', 'order_in_sidebar_network', ...)

Check out the Django docs for info on how to use the values function if you haven't used it before.

like image 14
Craig Blaszczyk Avatar answered Oct 13 '22 17:10

Craig Blaszczyk