Django Newbie ManyRelated Manager不是Iterable问题

时间:2010-01-13 19:20:28

标签: django django-models django-admin

我正在尝试通过组合来自其他两个字段的元素来创建产品代码(在管理中) - 其中一个是ManyToManyField。我想遍历该字段以查明是否已选择特定的产品选项,并将其变体附加到该不可编辑的产品代码中,如下所示:

class ShirtColorClass(models.Model):
    shirtcolor = models.CharField(_('Shirt Color'), unique=True, max_length=40)
    def __unicode__(self):
        return self.shirtcolor

class ShirtClass(models.Model):
    shirtmodel = models.CharField(_('Model of Shirt'), max_length=40)
    shirtclr = models.ManyToManyField(_(ShirtColorClass, verbose_name='Shirt Color'))
    shirtcode = models.CharField(_('Code for the shirt'), max_length=80, editable=False)
    #...10 more fields...
    def __unicode__(self):
        return self.shirtmodel
    def save(self):
        for item in self.shirtclr: #these are the lines I'm not sure how to do
            if 'Blue' in self.shirtclr:
                self.shirtcode = u'%s%s' % ('B', self.shirtmodel)
            else:
                self.shirtcode = self.shirtmodel
            super(ShirtClass,self).save()

目前我收到的是ManyRelatedManager而非Iterable消息,所以我知道我做错了什么,但我不知道是什么......我提前道歉这是一个愚蠢的新手问题。谢谢。

3 个答案:

答案 0 :(得分:13)

尝试在其上调用.all()

答案 1 :(得分:2)

致电filter()

def save(self):
    if self.pk!=None:
        if self.shirtclr.filter(shirtcolor='Blue'):
            self.shirtcode = u'%s%s' % ('B', self.shirtmodel)
        else:
            self.shirtcode = self.shirtmodel
    else:
        self.shirtcode = ''

您可以通过将self.shirtcode = ''添加到

来避免default=''
shirtcode = models.CharField(_('Code for the shirt'), max_length=80, editable=False, default='')

答案 2 :(得分:0)

感谢您的回答。我将你的两个答案合并为一个......带有过滤器的属性如下:

 def _get_blue_shirts(self):
  if self.shirtclr.filter(shirtcolor='Blue'):
   return '%s%s' % ('B', self.shirtmodel)
  else:
   return self.shirtmodel
 blue_shirts=property(_get_blue_shirts)

虽然这种方法肯定有效,但我可以看到它的问题,因为我写了它。首先,我想在管理员中搜索,例如,“B13A”作为衬衫模型,让我明白我的意思是“13A”衬衫,蓝色作为其颜色之一。由于ModelAdmin.search_fields似乎需要解析为实际字段,因此这种方法在这方面不起作用(如果我错了,请纠正我)。我所关心的另一个问题是该属性似乎非常重要......为每一行执行单独的选择(而专用列只需要一个整体选择...再次,如果我错了,请纠正我)。关于如何解决这些问题的任何想法?也许我可以采取另一种方式来解决它?

PS。 Antony ...我尝试了修改后的重写的save()并且仍然得到“'ShirtClass'实例需要在使用多对多关系之前有一个主键值”错误。我在这里做错了吗?

很多,很多,非常感谢所有人, -bkev