Django Newbie менеджер ManyRelated не Повторяемый Вопрос

Я пытаюсь создать код продукта (в администраторе) путем объединения элементов от двух других полей - одним из которых является 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 не Повторяемое сообщение, таким образом, я знаю, что делаю что-то не так, но я не знаю что... Я приношу извинения заранее за этот являющийся глупым вопросом о новичке.Спасибо.

6
задан bkev 13 January 2010 в 19:20
поделиться

3 ответа

Спасибо за оба ответа. Я объединил оба ваших ответа в одно... свойство с фильтром вроде:

 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" должен иметь первичное значение ключа, прежде чем можно будет использовать много-много отношений". Я что-то не так делаю?

Много, много, много спасибо всем, -бкев

0
ответ дан 8 December 2019 в 16:03
поделиться
Вызов

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
ответ дан 8 December 2019 в 16:03
поделиться

Попробуйте позвонить . Все () на нем.

13
ответ дан 8 December 2019 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: