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

62415 次浏览

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.

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

{% for area in world_areas.all %}

I run into this issue by a reckless mistake:

 for physicalserver in task.physicalservers:
physicalserver.relieve_task()

The task.physicalservers is RelatedManager object, in my case I should get the task's physicalservers, there should add .all().

for physicalserver in task.physicalservers.all():

You have to iterate over set to get values related to a fk in a model.

class Area(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)




class CountryArea(models.Model):
name = models.CharField(max_length = 120)
area = models.ForeignKey(Area, verbose_name = 'Area')


## Assuming you have an object; area
## To get the all the counties related to that area you can do;
{% for obj in area.countryarea_set.all %}
<h4> \{\{ obj.name }} </h4>
{% endfor %}