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
列表也将仅包含这些图书。
我有这些型号:
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
列表也将仅包含这些图书。