2010-01-13 3 views
6

두 개의 다른 필드 (하나는 ManyToManyField)의 요소를 결합하여 제품 코드를 만들려고합니다. 그래서 같이 특정 제품 옵션이 선택되어 있는지 확인하려면 해당 필드를 반복하고, 그 이외의 편집 제품 코드로의 변화를 추가하고 싶습니다 : 나는 '순간Django Newbie ManyRelated Manager Iterable 질문이 없습니다.

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

default=''을 추가하여 self.shirtcode = ''을 피할 수는 모두 귀하의 답변 주셔서 감사합니다. 그래서 같은 필터 ... 하나에 속성을 답을 모두 통합 :이 방법은 확실히 작동

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"를 셔츠 모델로 검색하고, Blue의 색상 중 하나로 사용할 수있는 "13A"셔츠라는 것을 이해하고 싶습니다. ModelAdmin.search_fields가 실제 필드를 분석해야하기 때문에이 접근법은 작동하지 않습니다 (내가 틀렸다면이 방법을 사용하십시오). 내가 가지고있는 다른 관심사는 속성이 매우 SQL-heavy ... 각 행에 대해 별도의 선택을 실행하는 것입니다 (전용 열은 전체 선택을 필요로하는 반면 ... 내가 틀렸다면 다시 수정해야 함). 이러한 우려 사항을 어떻게 해결할 수 있을지에 대한 아이디어가 있습니까? 아마 내가 그것에 대해 갈 수있는 또 다른 방법?

추신. Antony ... 수정 된 재정의 된 save()를 시도했지만 여전히 " 'ShirtClass'인스턴스가 다 대다 관계를 사용할 수 있기 전에 기본 키 값을 가져야합니다."오류가 발생했습니다. 내가 여기서 뭔가 잘못하고있는거야? 모든

많은, 많은, 많은 감사, -bkev

12

.all()을 호출 해보세요.

+0

이 ...이 같은 뭔가 : 데프 (자동) 저장 : self.shirtclr.all()의 항목에 대한 : 항목의 경우 = = '청색' self.shirtcode = U '% S % S'% ('B', self.shirtmodel) 다른 : self.shirtcode = self.shirtmodel 슈퍼 (ShirtClass 자기) .save() 나는 그것을 작동시킬 수 없다. ShirtClass는 iterable이 아니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 다시 한번 감사드립니다. – bkev

+0

나는 우리가 뒤로 물러나서 실제로 여기에서 성취하려는 것을 발견해야한다고 생각합니다. –

+0

도움을 주셔서 대단히 감사합니다. 첫 번째 두 요소를 연결하여 세 번째 필드를 저장하려고합니다 ... 유일한 두 가지 중 하나는 ManyToManyField이고이 인스턴스의 내용에 액세스하는 적절한 방법을 알지 못합니다. 필자가 맨 위에 입력 한 내용을 살펴보면 for 루프가 필요 없다고 생각합니다 ... 전에 Python을 사용했을 때 "in"은 목록을 볼 때 저를 위해 작업을 완료했습니다. 그러나 "self.shirtcode.all()"의 'Blue'가 나를 위해 작동하지 않는 것 같습니다. 나는이 일이 성취하기가 어렵지 않아야한다고 생각하고 있습니다.하지만 저는 뭔가를 놓치고 있습니다. ... – bkev

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 = '' 

당신이

shirtcode = models.CharField(_('Code for the shirt'), max_length=80, editable=False, default='') 
+0

이것을 사용해 보셨습니까? –

+0

예 (답장을 보내 주셔서 감사합니다 ... 죄송합니다. 지금 당장 답장을 보내지 못했습니다.) 기존 인스턴스가 없으면 ""ShirtClass 인스턴스가 일대일 키 값을 가져야 만 다 대다 관계를 사용할 수 있습니다. " 만약 하나가 있었다면, 포스트는 완성 될 것이지만, 내가 선택한 컬러에 관계없이 셔츠 코드는 셔츠 모델과 동일 할 것입니다. 어떤 아이디어? – bkev

+0

예외가 수정 된 답변은 지금 작동합니다. shirtmodel과 항상 동일한 셔츠 코드는 'blue'또는 'blue'가 아닌 'Blue'입니다. –