Как получить дочерние атрибуты в родительском объекте - PullRequest
4 голосов
/ 28 июля 2011

Я довольно новичок в Django, и кажется, что может быть простой и очевидный способ сделать это, но в таком случае я не смог его найти.

(слегка упрощенный код)

У меня есть начальный класс

class Article(models.Model):
    ...

и вторичный класс

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

Существует ли простой способ получить атрибуты headline объекта Article (или, скорее, получить атрибуты headline всех объектов Headline, связанных с объектом Article)? Я знаю, что было бы возможно отфильтровать объекты Headline по атрибуту article, но я подозреваю, что есть более быстрый и простой способ. Можно ли, например, добавить в класс Article метод, который бы возвращал все связанные Headline объекты?

Ответы [ 3 ]

5 голосов
/ 28 июля 2011

Если у вас есть один экземпляр Article, вы можете получить все объекты заголовка с помощью

article.headline_set.all()

Возвращает QuerySet, который вы можете использовать, как и любой другой.

Редактировать: Если вы хотите получить фактическое значение заголовка, то, как и для любого другого набора запросов, вам нужно будет получить один экземпляр Headline. Например,

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

Edit2: Поскольку Тибо J указывает в комментариях, вы можете получить все заголовки с помощью

headlines = [headline.headline for headline in article.headlines.all()]
3 голосов
/ 29 июля 2011

Гораздо лучший способ получить все актуальные заголовки - использовать values_list:

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

. Это уменьшает попадание в базу данных, фактически запрашивая поле headline.

1 голос
/ 28 июля 2011

Вы можете указать свойство related_name, чтобы задать имя свойства, которое будет использоваться для доступа к заголовкам статей.

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

В противном случае имя свойства по умолчанию будет headline_set, как указано в murgatroid99.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...