2011-07-15 12 views
38

Hola, he mirado a través de algunas publicaciones similares aquí en SO, pero no he encontrado nada que haya resuelto mi problema. Tengo los siguientes modelos,El objeto 'RelatedManager' no es iterable Django

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 

yo he dado la siguiente vista hasta

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

tratando de iterar sobre los world_areas objeto como tal

{% for area in world_areas %} 

produce un error de sintaxis de la plantilla

objeto 'RelatedManager' no es iterable

¿Alguien tiene alguna idea de por qué esto está ocurriendo? ¡Realmente no puedo evitar esto! Strangley, esto funciona para mí en shell: ¿me estoy perdiendo algo obvio?

Muchas gracias a todos los que pudieron ayudar!

+0

¿Ha intentado borrar el caché? –

+0

¡Sí, intenté sin caché! –

+1

¿Estás seguro de que no está leyendo nada del caché? –

Respuesta

8

En general, es una buena práctica utilizar values o values_list para pasar datos de un conjunto de consulta a una plantilla.

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

Mira la Django docs para obtener información sobre cómo utilizar la función values si no lo ha usado antes.

101

Callall() para recuperar los elementos del administrador.

{% for area in world_areas.all %} 
+4

esta es una buena solución. por favor marque como aceptado. usted puede filtrar aquí también. –

+3

+1 y se pregunta, ¿por qué no se acepta como respuesta? – andi

+0

porque fue respondida con 2 años de retraso. – user1040495

Cuestiones relacionadas