Я пытаюсь создать код продукта (в администраторе) путем объединения элементов от двух других полей - одним из которых является 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 не Повторяемое сообщение, таким образом, я знаю, что делаю что-то не так, но я не знаю что... Я приношу извинения заранее за этот являющийся глупым вопросом о новичке.Спасибо.
Спасибо за оба ответа. Я объединил оба ваших ответа в одно... свойство с фильтром вроде:
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, похоже, нужно разрешить в реальном поле, то такой подход в этом отношении не работает (поправьте меня, если я там ошибаюсь). Другая моя проблема в том, что свойство кажется очень SQL-тяжелым...выполняя отдельный select для каждой строки (в то время как для выделенного столбца нужен только общий select...опять же, поправьте меня, если я ошибаюсь). Есть идеи, как я могу решить эти проблемы? Возможно, я мог бы пойти другим путем?
PS. Антоний... Я попробовал переопределить save() и все равно получил ошибку "экземпляр ShirtClass" должен иметь первичное значение ключа, прежде чем можно будет использовать много-много отношений". Я что-то не так делаю?
Много, много, много спасибо всем, -бкев
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='')