我正在尝试通过组合来自其他两个字段的元素来创建产品代码(在管理中) - 其中一个是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消息,所以我知道我做错了什么,但我不知道是什么......我提前道歉这是一个愚蠢的新手问题。谢谢。
答案 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