我试图像这样实现关键字搜索:
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的任何建议?还是可以提高性能的替代方法?