Django中反向关系的过滤输出项

Filter output items of reverse relations in Django

我有这些型号:

class Author(models.Model):
    name = models.CharField(max_length=50)


class Book(models.Model):
    name = models.CharField(max_length=150)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books")
    published_at = models.DateField()

这是我的查询:

Author.objects.filter(books__published_at__ragne=[date_from, date_to]).annotate(books_count=Count('books'))

查询的输出将发送到下面的序列化器(继承 django rest framework 序列化器):

class AuthorSerializer(serializers.ModelSerializer):
    books_count= serializers.IntegerField(read_only=True)
    books = serializers.StringRelatedField(many=True)

    class Meta:
        model = Author
        fields = ['id', 'name', 'books_count', 'books']

AuthorSerializer 输出将是在指定范围内至少出版了一本书的所有作者,以及每个作者出版的书籍数量,以及所有作者的字符串表示每位作者的书籍。

books__published_at__ragne 过滤器会影响输出作者和书籍数量,但不会影响作者的书籍。我的意思是对于每个作者,所有的书都被退回,而不仅仅是在指定范围内出版的书。

我怎样才能同时过滤具有指定参数的图书?

您可以使用 Prefetch 对象:

from django.db.models import <strong>Prefetch</strong>

Author.objects.filter(
    books__published_at__range=[date_from, date_to]
).annotate(books_count=Count('books')).prefetch_related(
    <strong>Prefetch(</strong>
        'books',
        queryset=Book.objects<strong>.filter(published_at__ragne=[date_from, date_to])
    )</strong>
)

这意味着 books_count 将确定该范围内出版的图书数量,而 books 列表也将仅包含这些图书。