如何优雅获取指定Topic下的所有Entry?Django ORM查询问题
解决Django中批量获取指定Topic下所有Entry的问题
嘿,我来帮你搞定这个问题!你遇到的错误是因为filter()返回的是多个Topic的集合(QuerySet),而entry_set是单个Topic实例才有的属性,直接在QuerySet上调用肯定会报错。
一步到位的优雅写法
不用绕弯子查Topic再取Entry,直接从Entry模型反向过滤就行:
questions = Entry.objects.filter(topic__text__icontains='question')
为什么原来的代码会报错?
你之前写的Topic.objects.filter(text__icontains='question').entry_set.all(),问题出在filter()返回的是QuerySet(多个Topic对象的集合),而entry_set是单个Topic实例特有的反向关联管理器——只有单个Topic对象才能通过它获取对应的Entry,集合是没有这个属性的,所以才会抛出AttributeError。
补充说明
Django的双下划线查询真的很实用,这里的topic__text__icontains就表示:找到所有关联的Topic的text字段包含"question"的Entry。这种写法不仅简洁,而且查询效率也比先查Topic再逐个取Entry要高,因为它会生成一条SQL语句完成查询,而不是多次数据库请求。
你的模型定义没问题,用这个写法完全能满足需求,比你之前先拿id再用get的方式优雅多啦!
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

