2010-01-13 23 views
6

Bir ürün kodu (admin'te), bir diğeri ManyToManyField olan iki başka alandan birleştirerek bir ürün kodu oluşturmaya çalışıyorum. Öyle gibi belirli bir ürün seçeneği seçildi olmadığını öğrenmek için o alanın yinelemenize ve bu düzenlenemeyen ürün koduna bunun bir varyasyonunu eklemek istiyorsunuz: Ben andaDjango Newbie ManyRelated Manager Yinelenen Bir Soru Değil

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'ın yinelenemeyen bir mesaj almasını sağlıyorum, bu yüzden yanlış bir şey yaptığımı biliyorum, ama ne olduğunu bilmiyorum ... Bu aptalca yeni bir soru olmak için şimdiden özür dilerim. Teşekkür ederim.

cevap

0

içine default='' ekleyerek self.shirtcode = '' önleyebilirsiniz hem cevaplar için teşekkür ederiz. Ben şöyle bir filtre ile ... birine bir özellik cevaplar her iki birleşti: Bu yaklaşım kesinlikle çalışır

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) 

iken ben yazdığınız gibi, onunla sorunları görebilirsiniz. İlk olarak, yönetici olarak "B13A" ile gömlekli bir model olarak arama yapmak istiyorum ve bunun anlamını, Blue'nun renkleri arasından biri olan "13A" bir gömlek olduğunu anlıyorum. ModelAdmin.search_fields'ın gerçek bir alana çözülmesi gerektiği göz önüne alındığında, bu yaklaşım bu konuda çalışmaz (eğer yanılıyorsam düzeltin). Benim diğer endişe mülkiyet çok SQL-ağır görünüyor ... her satır için ayrı bir seçim yürütürken (özel bir sütun sadece genel bir seçim gerekir ... yine, yanlış varsa beni düzeltmek). Bu endişeleri gidermek için nasıl gidebileceğime dair herhangi bir fikir var mı? Belki başka bir yoldan gidebilir miyim?

PS. Antony ... Düzeltilmiş geçersiz kılınmış kaydetmeyi() denedim ve hala "çok sayıda ilişkiden önce kullanılabilen" 'ShirtClass' örneğinin birincil anahtar değerine sahip olması gerekiyor. Burada yanlış bir şey mi yapıyorum? herkese

Birçok çoğu Çok teşekkürler, -bkev

12

Üzerinde .all() aramayı deneyin.

+0

... Bu gibi pek bir şey: def (öz) kaydedin: self.shirtclr.all() öğenin : öğe ise = = 'Mavi': self.shirtcode = u '% s% s' % ('B', self.shirtmodel) başka : self.shirtcode = self.shirtmodel süper (ShirtClass, kendinden) .save() Bunu işe yaratamıyorum ... ShirtClass yinelenen bir hata değil. Neyi yanlış yapıyorum? Tekrar teşekkürler. – bkev

+0

Geri adım atmamız ve aslında burada neyi başarmaya çalıştığınızı öğrenmemiz gerektiğini düşünüyorum. –

+0

Yardımlarınız için çok teşekkür ederim. İlk iki bileşenini birleştirerek üçüncü bir alanı kaydetmeye çalışıyorum ... tek sorun, ilk iki yöntemden birinin ManyToManyField olması ve içeriğine bu şekilde erişmenin uygun yolunu bilmem. En üste yazdıklarıma baktığımda, bir döngü için ihtiyacım olduğunu düşünmüyorum ... daha önce Python'u kullandığımda, "içeri" bir listeye bakarken benim için çalışmamı yaptı. Ancak, "self.shirtcode.all()" içinde "Mavi" ise benim için çalışmıyor gibi görünüyor. Bunu başarmak için zor bir şey olmamalı diye düşünüyorum ... ama bir şey kaçırmıyorum ... – bkev

2

çağrı 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 = '' 

Eğer

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

bunu denediniz mi? –

+0

Evet (ve cevabınız için teşekkür ederim ... üzgünüm size hemen geri dönemem). Mevcut bir örnek yoksa, "çoktan çoğa ilişkisi kullanılmadan önce bir" birincil "anahtar değere sahip olması gereken" "bir" ShirtClass "örneğim var. Eğer bir tane olsaydı, Post tamamlanırdı, ama hangi renk seçsem de shirtcode shirtmodel'e eşit olurdu. Herhangi bir fikir? – bkev

+0

İstisna gelince - cevap düzeltildi, şimdi çalışmalıdır. Gömlek kodunun her zaman shirtmodel'e eşit olması durumunda, tam olarak "Mavi" olduğundan emin misiniz, örneğin "mavi" veya "mavi" değil –