2010-01-13 10 views
6

Estoy intentando crear un código de producto (en el administrador) combinando elementos de otros dos campos, uno de los cuales es ManyToManyField. Me gustaría recorrer ese campo para averiguar si una opción específica del producto ha sido elegido, y anexar una variación de la misma para que el código del producto no editable, así:Django Novato ManyRelated Manager no Iterable Pregunta

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() 

En este momento' Estoy recibiendo un mensaje de ManyRelatedManager no Iterable, entonces sé que estoy haciendo algo mal, pero no sé qué ... Me disculpo de antemano por ser una estúpida pregunta de novato. Gracias.

Respuesta

0

Gracias tanto para sus respuestas. Fusioné tanto de sus respuestas en una sola ... una propiedad con un filtro de este modo:

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) 

Si bien este enfoque definitivamente funciona, puedo ver problemas con él como lo he escrito. En primer lugar, me gustaría buscar en el administrador con, por ejemplo, "B13A" como modelo de camisa y hacer que entienda que lo que quiero decir es una camisa "13A" disponible con azul como uno de sus colores. Dado que el ModelAdmin.search_fields parece necesitar resolverse en un campo real, este enfoque no funciona a este respecto (corríjame si me equivoco allí). La otra preocupación que tengo es que la propiedad parece muy pesada en SQL ... ejecutando una selección por separado para cada fila (mientras que una columna dedicada solo necesitaría una selección general ... otra vez, corríjame si estoy equivocado). ¿Alguna idea sobre cómo podría abordar estas preocupaciones? ¿Quizás otra forma de hacerlo?

PS. Antony ... Probé el save overridden revisado() y todavía obtuve la instancia "'ShirtClass' necesita tener un valor de clave primaria antes de que se pueda usar una relación de muchos a muchos" error. ¿Estoy haciendo algo mal aquí?

Muchas, muchas, muchas gracias a todos, -bkev

12

Intenta llamar al .all() en él.

+0

... así que algo como esto: def Guardar (auto): de producto en self.shirtclr.all(): si el artículo = = 'azul': self.shirtcode = u '% s% s' % ('B', self.shirtmodel) otra cosa: self.shirtcode = self.shirtmodel super (ShirtClass, auto) .save() No puedo lograr que funcione ... ShirtClass no iterable es el error. ¿Qué estoy haciendo mal? Gracias otra vez. – bkev

+0

Creo que tenemos que dar un paso atrás y descubrir lo que en realidad está tratando de lograr aquí. –

+0

Muchas gracias por su ayuda. Estoy tratando de salvar un tercer campo concatenando los componentes de los dos primeros ... la única complicación es que uno de los dos primeros es un ManyToManyField y no sé la forma correcta de acceder a sus contenidos en esta instancia. Mirando lo que escribí en la parte superior, no creo que necesite un bucle de espera allí ... cuando he usado Python antes, "en" me ha hecho el trabajo al mirar a través de una lista. Sin embargo, "si 'Blue' en self.shirtcode.all()" no parece funcionar para mí. Sigo pensando que esto no debería ser una tarea difícil ... pero me falta algo ... – bkev

2

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

se puede evitar mediante la adición de self.shirtcode = ''default='' en

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

¿Has probado esto? –

+0

Sí (y gracias por su respuesta ... lo siento, no pude contactarte de inmediato). Si no había una instancia existente, obtuve una instancia de "ShirtClass" que necesita tener un valor de clave primaria antes de que se pueda usar una relación de muchos a muchos ". Si hubiera una, el Post se completaría, pero el código de la camisa sería igual al modelo de la camisa, sin importar el color que elija. ¿Algunas ideas? – bkev

+0

En cuanto a la excepción, corrigió la respuesta, debería funcionar ahora. En cuanto a que shirtcode siempre es igual a shirtmodel, ¿estás seguro de que es exactamente ''Blue'', no por ejemplo'' blue'' o ''blue'' –

Cuestiones relacionadas