2008-12-27 16 views
12

Tengo las siguientes clases: Ingredientes de la receta, y RecipeContent ...¿Puedo usar ForeignKey en __unicode__ return?

class Ingredient(models.Model): 
    name = models.CharField(max_length=30, primary_key=True) 
    qty_on_stock = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

class Recipe(models.Model): 
    name = models.CharField(max_length=30, primary_key=True) 
    comments = models.TextField(blank=True) 
    ingredient = models.ManyToManyField(Ingredient) 

    def __unicode__(self): 
     return self.name 

class RecipeContent(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    ingredients = models.ForeignKey(Ingredient) 
    qty_used = models.IntegerField() 

pero para __ __unicode() en RecipeContent me gustaría usar el nombre de la receta a la que pertenece esta RecipeContent a ... ¿Hay una forma de hacerlo?

+0

Solo una nota sobre el estilo, recomendaría que no pluralice sus nombres de campo ForeignKey ya que solo pueden señalar un registro a la vez. Me refiero a su campo de ingredientes en RecipeContent. – Soviut

Respuesta

26
class RecipeContent(models.Model): 
    ... 
    def __unicode__(self): 
    # You can access ForeignKey properties through the field name! 
    return self.recipe.name 
+0

suspiro ... ¡era tan simple! muestra qué novato soy ... Gracias por la respuesta. – EroSan

+1

Usando Django 1.6. Obtengo: el objeto 'NoneType' no tiene ningún atributo 'name'. Método: def __unicode __ (self): return self.instrument.name. Y: clase Instrument (models.Model): name = models.CharField (max_length = 200). Y a donde llamo "unicode": instrument = models.ForeignKey (Instrument, null = True, blank = True) – Timo

+0

Obtuve esto también. Soy bastante, esto ocurre cuando algunas instancias tienen esto, mientras que otras no. Terminé teniendo que tirar. – Ryan

0

Sí, puede (como bishanty puntos), pero estar preparado para la situación en la que se llama, pero __unicode__() FK no está configurado todavía. Entré en esto algunas veces.

+0

cierto ... pero quizás pueda manejar eso usando algo como "if self.recipe.name: return self.recipe.name"? – EroSan

2

Si sólo se preocupan por la parte del nombre de la receta, que puede hacer:

class Recipe(models.Model): 
    name = models.CharField(max_length=30, primary_key=True) 
    comments = models.TextField(blank=True) 
    ... 

    def __unicode__(self): 
     return self.name 

class RecipeContent(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    ... 

    def __unicode__(self): 
     return str(self.recipe) 
0

En Python 3 no hay __unicode__, es necesario utilizar __str__ lugar.

class RecipeContent(models.Model): 
     ... 
     def __str__(self): 
      return self.recipe.name 
Cuestiones relacionadas