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 - это то, что вам нужно здесь!