'RelatedManager'对象不是可迭代的Django

Mik*_*tes 51 django django-models django-queryset django-views

嘿,我已经浏览了一些关于SO的一些simliar帖子,但还没有找到解决我问题的任何东西.我有以下型号,

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
Run Code Online (Sandbox Code Playgroud)

我有以下视图设置

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))
Run Code Online (Sandbox Code Playgroud)

试图迭代遍历world_areas对象

{% for area in world_areas %}
Run Code Online (Sandbox Code Playgroud)

产生模板语法错误

'RelatedManager'对象不可迭代

任何人都有任何想法为什么会这样?真的似乎无法绕过这个!strangley这对我来说是在shell:S我错过了一些明显的东西???

非常感谢能够提供帮助的人!

laf*_*ste 137

调用 all()从管理器中检索元素.

{% for area in world_areas.all %}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案.请标记为已接受.你也可以在这里过滤. (4认同)
  • +1并且想知道为什么它不被接受作为答案? (3认同)
  • 来自模板的 @MitchellvanZuylen 方法调用不使用括号。添加了文档链接。 (2认同)

Cra*_*zyk 11

通常,最好使用valuesvalues_list将数据从查询集传递到模板.

world_areas = Areas.objects.select_related().all().values_list('name', 'order_in_sidebar_network', ...)
Run Code Online (Sandbox Code Playgroud)

查看Django文档,了解如何使用该values功能,如果您以前没有使用过它.


air*_*aft 7

我因一个鲁莽的错误遇到了这个问题:

 for physicalserver in task.physicalservers:
        physicalserver.relieve_task()
Run Code Online (Sandbox Code Playgroud)

task.physicalserversISRelatedManager对象,在我的情况下,我应该得到的任务的physicalservers,应该增加.all()

for physicalserver in task.physicalservers.all():
Run Code Online (Sandbox Code Playgroud)