首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Queryset建筑

Django Queryset建筑
EN

Stack Overflow用户
提问于 2013-11-06 20:01:03
回答 1查看 65关注 0票数 0

假设我的模型如下所示,我将如何编写一个查询来过滤有关模型的派生数据?在这个例子中,我想要拉出“时代新罗马的所有页面,它们都是书的一部分,只有整整十页,所有的页面都不是漫画版的。”我需要多个查询(带有这些属性的筛选簿并使用__in进行第二个筛选)还是去美化我的数据库?理想情况下,这些模型可能会变得相当大,我希望快速查找这些导出的数量,所以我认为去正规化可能是我最好的选择。

代码语言:javascript
复制
class Book(models.Model):
    author = models.CharField()

class Page(models.Model):
    number = models.IntegerField()
    font = models.Charfield()
    book = models.ForeignKey(Book)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 20:37:53

首先,我假设PageBook之间存在一个外键关系,因为页面属于一本书。

代码语言:javascript
复制
class Page(models.Model):
    book = models.ForeignKey(Book)
    number = models.IntegerField()
    font = models.Charfield()

如果不对数据库进行显著修改,可能最容易将其分解为两个查询。第一部分是生成一个清单的书籍,有10页,但没有漫画书。您可以在反向查找Page之间的FK关系上使用Book。此外,您还需要注解页面编号。

代码语言:javascript
复制
book_list = Book.objects.exclude(page__font="Comic Sans").annotate(page_count=Count('page')).filter(page_count=10)

查询的最后一部分相当简单。

代码语言:javascript
复制
page_query_set = Page.objects.filter(font="Times New Roman").filter(book__in=book_list)

如果运行缓慢,只需在Books模型中复制数据,就可以减少处理量,这样每次进行查询时都不会计算页面数。如果每本书只有一种字体,那么您也可以在图书模型中复制它,以节省时间。

但是,我建议在开始时保持简单,并且只有在需要时才进行优化,并且它会开始减速。可能有更好的方法来处理它,这取决于它的使用方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19821622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档