Django Newbie Многое связанный менеджер не повторяемый вопрос - PullRequest
6 голосов
/ 13 января 2010

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

Ответы [ 3 ]

13 голосов
/ 13 января 2010

Попробуйте позвонить .all() на него.

2 голосов
/ 13 января 2010

вызов 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='')
0 голосов
/ 15 января 2010

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

 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 ... выполнение отдельного выбора для каждой строки (тогда как для выделенного столбца просто потребуется общий выбор ... опять же, исправьте меня, если я ошибаюсь). Любые идеи относительно того, как я мог бы решить эти проблемы? Возможно, я мог бы пойти другим путем?

PS. Антоний ... Я попробовал пересмотренную переопределенную функцию save () и все еще получил сообщение об ошибке «Экземпляр ShirtClass должен иметь значение первичного ключа, прежде чем можно будет использовать отношение многие ко многим». Я что-то здесь не так делаю?

Много, Много, Большое спасибо всем, -bkev

...