Вы можете фильтровать содержимое связанной модели, используя двойные подчеркивания ('__'
), поэтому вы можете фильтровать по атрибуту year
отношения year
для Book
этого Author
:
Author.objects.filter(<b>book__year__year='2018'</b>).distinct()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .distinct()
полезно, так как в противном случае Author
s, которые опубликовали несколько книг в 2018 году, будут встречаться несколько раз в наборе запросов.
При этом создание здесь Year
объекта кажется довольно странным, а сделать его CharField
еще более странным (поскольку сортировка по year
приведет к сортировке * лексикографически). Поле num
в модели Author
, вероятно, также должно быть IntegerField
[Django-doc] .
Лучшее моделирование может быть:
class Book(models.Model):
name = models.CharField(
verbose_name = "Library Name",
max_length = 255
)
author = models.ForeignKey(
Author,
on_delete=models.CASCADE
)
<b>year = models.IntegerField()</b>
class Author(models.Model):
name = models.CharField(
verbose_name = "Author's Name",
max_length = 255
)
<b>num = models.IntegerField(default=0)</b>
В этом случае мы можем запросить Author
с, кто опубликовал книгу в 2018 году с:
Author.objects.filter(<b>book__year=2018</b>).distinct()
Однако все еще неясно, что num
делает здесь. Если он содержит количество книг, то лучше использовать .annotate(..)
, поскольку он позволяет избежать дублирования данных.