Django Оптимальный способ получения списка атрибутов модели

Допустим, это мой models.py файл:

class Paper(models.Model):
  title = models.CharField(max_length=20, null=False, blank=False)


class Author(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  papers = models.ManyToManyField(Paper, null=False, blank=False)

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

В моем views.py случае, когда у меня есть объект автора, мне нужно получить список со всеми названиями его работ. Я делаю следующее:

user = User.objects.get(username=request.user)
author = Author.objects.get(user=user)
papers = [paper.title for paper in author.papers.all()]

Есть ли в Django способ сделать такой запрос без необходимости итерации по авторам статей? Может быть, есть встроенная функция или что-то, что я упускаю, есть предложения?

Этого должно быть достаточно

papers_by_author = Author.objects.filter(
    user__username=request.user
    ).values('papers__title')

кроме того, если вы prefetch_relatedв вашем коде. вы получите некоторую скорость.

 Author.objects.get(user=user).prefetch_related('papers')

Также вы можете получить все работы определенного автора например, чтобы получить автора, как в вашем коде:

author = Author.objects.get(user=user)

и затем получить все работы этого автора:

author.papers.values_list("title", flat=True)

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

Подводя итог, values_list() с flat=True - это то, что вам нужно здесь!

Вернуться на верх