Soy bastante nuevo en Django y parece que podría haber una manera fácil y obvia de hacerlo, pero si es así, no he podido encontrarlo.

(Código ligeramente simplificado)

Tengo una clase primaria

class Article(models.Model):
    ...

Y una clase secundaria

class Headline(models.Model):
    article = models.ForeignKey(Article)
    headline = models.CharField(max_length=200)

¿Hay una manera simple de obtener los atributos headline de un objeto Article (o más bien, obtener los atributos headline de todos los objetos Headline asociados con los {{X4} }} objeto)? Sé que sería posible filtrar los objetos Headline por el atributo article, pero sospecho que hay una manera más rápida y sencilla. ¿Es posible agregar un método a la clase Article, por ejemplo, que devolvería todos los objetos Headline asociados?

4
stillLearning 28 jul. 2011 a las 19:52

3 respuestas

La mejor respuesta

Una forma mucho mejor de obtener todos los titulares reales es usar values_list:

article.headline_set.values_list('headline', flat=True)

Esto reduce el impacto en la base de datos al solo pedir el campo headline.

3
Daniel Roseman 29 jul. 2011 a las 08:54

Si tiene una sola instancia de Article, puede obtener todos los objetos de título con

article.headline_set.all()

Esto devuelve un QuerySet que puede usar como cualquier otro.

Editar: Si desea obtener el valor del título real, al igual que para cualquier otro conjunto de consultas, necesitará obtener una sola instancia de Headline. Por ejemplo,

headline = article.headline_set.all()[0].headline

Edit2: Como Thibault J señala en los comentarios, puede obtener todos los titulares con

headlines = [headline.headline for headline in article.headlines.all()]
5
murgatroid99 28 jul. 2011 a las 17:30

Puede especificar la propiedad related_name para establecer el nombre de la propiedad que se utilizará para acceder a los titulares de los artículos.

class Article(models.Model):
    pass

class Headline(models.Model):
    article = models.ForeignKey(Article, related_name='headlines')

a = Article.objects.all()[0]
print a.headlines.all()

De lo contrario, el nombre de propiedad predeterminado será headline_set, como lo indica murgatroid99.

1
Thibault J 28 jul. 2011 a las 16:12