【问题标题】:'RelatedManager' object is not iterable Django'RelatedManager' 对象是不可迭代的 Django
【发布时间】:2011-10-05 23:50:28
【问题描述】:

嘿,我在 SO 上浏览了一些类似的帖子,但没有找到任何可以解决我问题的东西。我有以下型号,

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

我设置了以下视图

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

尝试像这样迭代 world_areas 对象

{% for area in world_areas %}

产生一个模板语法错误

'RelatedManager' 对象不可迭代

有人知道为什么会这样吗?似乎真的无法解决这个问题!扼杀这在 shell 中为我工作:S 我错过了一些明显的东西吗???

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

【问题讨论】:

  • 你试过清除缓存吗?
  • 所以你确定它没有从缓存中读取任何内容?
  • world_areas = Areas.objects.select_related().all() return render_to_response('network/index.html', locals(), context_instance=RequestContext(request)) 在函数返回同样的错误!
  • 任何人!我要砸我的电脑了:D 这在 shell 中工作我不明白
  • 进一步查看您的堆栈跟踪和模板代码....?

标签: django django-models django-views django-queryset


【解决方案1】:

Callall() 从管理器中检索元素。

{% for area in world_areas.all %}

【讨论】:

  • 因为它的回答晚了 2 年。
  • @user1040495 这并不意味着它不是正确的答案。问题作者应负责接受此答案。
  • 为什么模板中的all()all 调用有区别?
  • @MitchellvanZuylen 来自模板的方法调用不使用括号。添加了文档链接。
  • @MarshallX 因为用户可能会提出问题,等待一段合理的时间然后不再关心
【解决方案2】:

一般来说,最好使用valuesvalues_list 将数据从查询集传递到模板。

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

如果您以前没有使用过 values 函数,请查看 Django docs 了解如何使用它。

【讨论】:

    【解决方案3】:

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

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

    task.physicalserversRelatedManager 对象,在我的情况下,我应该获取任务的物理服务器,应该添加.all()

    for physicalserver in task.physicalservers.all():
    

    【讨论】:

      【解决方案4】:

      您必须迭代 set 以获取与模型中的 fk 相关的值。

      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 %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 2021-02-04
        • 2020-02-28
        • 2013-05-07
        • 2019-07-25
        相关资源
        最近更新 更多