在Django中结合Q对象和prefetch_related吗?

时间:2019-06-05 01:01:58

标签: django django-rest-framework

我试图像这样实现关键字搜索:

keyword = request.GET['keyword']

books = Book.objects.all()
books = books.filter(
    Q(title__contains=keyword) |
    Q(summary__contains=keyword) |
    Q(author__name__contains=keyword) |
    Q(author__biography__contains=keyword) |
)

使用以下型号:

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField()
    summary = models.CharField()
    author = models.ManyToManyField('Author', through='BookToAuthor')

class BookToAuthor(models.Model):
    id = models.AutoField(primary_key=True)
    book_id = models.ForeignKey('Book')
    author_id = models.ForeignKey('Author')

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField()
    biography = models.CharField()

一切正常,但是仅查询执行就花费大量时间(10-15秒)。通过反复试验,我已经能够确定这是由ManyToMany Q()字段引起的。我知道我可以使用prefetch_related来缓存/加入Python中的关系字段并提高性能。但是我很难让它与(Q()| Q()...)过滤结合使用。

关于如何合并prefetch_related的任何建议?还是可以提高性能的替代方法?

0 个答案:

没有答案