Django 如何为QuerySet添加关联数据 查询作者及名下全部书籍
解答
查询逻辑实现
Django 会为外键关联自动生成反向关系属性,默认命名规则为{小写关联模型名}_set,你无需额外使用annotate/aggregate就能直接获取关联书籍,仅需要调整查询语句优化性能即可:
- 直接使用默认反向关联的查询写法(可避免N+1查询问题):
from django.db.models import Count # 如果需要统计书籍总数才导入 # 基础查询,预加载所有关联书籍 authors = author.objects.prefetch_related('book_set').all() # 如果需要额外追加每个作者的书籍总数统计,可以搭配annotate authors = author.objects.prefetch_related('book_set').annotate(book_total=Count('book')).all()
- (可选优化)如果不想用默认的
book_set命名,可以在定义Book模型的外键时添加related_name参数:
class book(models.Model): author = models.ForeignKey('author', on_delete=models.CASCADE, related_name='books') # 其他字段
后续就可以用author.books.all()访问关联书籍,语义更清晰。
注意:你当前的Author模型里CharField参数存在笔误,是
max_length不是mac_length,否则运行会报错。
模板访问写法
直接在模板中循环反向关联的书籍集合即可,示例代码如下:
{% for author in authors %} *{{ author.name }}*: {% for book in author.book_set.all %} - {{ book.你的书名字段 }} {% endfor %} {% endfor %}
如果设置了related_name='books',就把author.book_set.all替换成author.books.all即可。
内容的提问来源于stack exchange,提问作者MichaelKleine
相关产品推荐
相关产品推荐

