Как мне ссылаться на «много» отношений «один ко многим» в Django / Python?

#python #django #python-3.x #foreign-keys #one-to-many

#python #django #python-3.x #внешние ключи #один ко многим

Вопрос:

Я использую Python 3.7 и Django. У меня есть следующие две модели…

 class Article(models.Model):
    title = models.TextField(default='', null=False)



class ArticleStat(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
    elapsed_time_in_seconds = models.IntegerField(default=0, null=False)
...
    class Meta:
       unique_together = ('article', "elapsed_time_in_seconds",)
  

Обратите внимание, что статья содержит несколько объектов ArticleStat. Если у меня есть объект «article» где-нибудь в моем коде, как мне ссылаться на его объект ArticleStat с наибольшим истекшим временем в_ин_секундах? Даже выполнение

 article.articlestats
  

приводит к ошибке, поэтому я даже не знаю, как ссылаться на связанные объекты ArticleStat из моего исходного объекта.

Комментарии:

1. Не могли бы вы опубликовать точную ошибку, пожалуйста?

2. article.articlestats это RelatedManager , а не набор запросов. Вы можете вызывать в основном те же методы, что и в objects для обычных моделей в соответствующем диспетчере. Например, all() , filter() count() , exists() first() , article.articlestats.all() и т.д. …: article.articlestats.first() выдает вам набор запросов со всеми связанными объектами, , , только первый объект (или ни один, если его нет).

Ответ №1:

article.articlestats эквивалентен ArticleStat.objects, он дает вам ссылку на менеджера. Вам нужно написать полное выражение запроса, такое как article.articlestats.all() или article.articlestats.filter(…) и т.д.

Чтобы получить то, что вы хотите, просто напишите:

 article.articlestats.all().order_by('-elapsed_time_in_seconds')[0]
  

Обратите внимание, что это вызвало бы ошибку IndexError, если нет объектов ArticleStat, связанных с предоставленной статьей