假设我的模型如下所示,我将如何编写一个查询来过滤有关模型的派生数据?在这个例子中,我想要拉出“时代新罗马的所有页面,它们都是书的一部分,只有整整十页,所有的页面都不是漫画版的。”我需要多个查询(带有这些属性的筛选簿并使用__in进行第二个筛选)还是去美化我的数据库?理想情况下,这些模型可能会变得相当大,我希望快速查找这些导出的数量,所以我认为去正规化可能是我最好的选择。
class Book(models.Model):
author = models.CharField()
class Page(models.Model):
number = models.IntegerField()
font = models.Charfield()
book = models.ForeignKey(Book)发布于 2013-11-06 20:37:53
首先,我假设Page和Book之间存在一个外键关系,因为页面属于一本书。
class Page(models.Model):
book = models.ForeignKey(Book)
number = models.IntegerField()
font = models.Charfield()如果不对数据库进行显著修改,可能最容易将其分解为两个查询。第一部分是生成一个清单的书籍,有10页,但没有漫画书。您可以在反向查找和Page之间的FK关系上使用Book。此外,您还需要注解页面编号。
book_list = Book.objects.exclude(page__font="Comic Sans").annotate(page_count=Count('page')).filter(page_count=10)查询的最后一部分相当简单。
page_query_set = Page.objects.filter(font="Times New Roman").filter(book__in=book_list)如果运行缓慢,只需在Books模型中复制数据,就可以减少处理量,这样每次进行查询时都不会计算页面数。如果每本书只有一种字体,那么您也可以在图书模型中复制它,以节省时间。
但是,我建议在开始时保持简单,并且只有在需要时才进行优化,并且它会开始减速。可能有更好的方法来处理它,这取决于它的使用方式。
https://stackoverflow.com/questions/19821622
复制相似问题