Запросы с помощью QuerySet
словарей
Вы можете сделать запрос, например:
Book.objects.values('name', 'author').annotate(
year=Max('published_years')
).order_by('name', 'author')
, что приведет к QuerySet
, охватывающему dict
ионариев, например:
<QuerySet [
{ 'name': 'titleA', 'author': 'authorA', 'year': date(1993, 2, 9)},
{ 'name': 'titleA', 'author': 'authorB', 'year': date(2008, 5, 7)},
{ 'name': 'titleB', 'author': 'authorC', 'year': date(1983, 1, 1)},
{ 'name': 'titleC', 'author': 'authorA', 'year': date(1923, 7, 15)},
]>
Рефакторинг и аннотирование
и затем вы можете их обработать, но, как указано в комментариях, если один и тот же name
/ author
содержит несколько дубликатов, это означает, что у вас естьанти-шаблон с именем дублирование данных в вашей модели.Вы, вероятно, должны изменить его на:
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
name = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
class BookDate(models.Model):
book = models.ForeignKey(Book)
date = models.DateField()
Тогда вы можете написать это как:
Book.objects.annotate(
author_name=F('author__name')
last_published=Max('bookdate__date')
)
, что является QuerySet
из Book
с (так что «более богатый»)) и с двумя дополнительными атрибутами: author_name
и last_published
уже доступны.