Django多对多关系查询:如何获取作者Mattia的所有书籍
Django多对多关系查询:获取指定作者的所有书籍
现有代码问题
你的代码里,autore.libri.all()查询关联书籍的逻辑是对的,但有几个关键问题导致无法返回正确结果:
- 仅返回固定字符串
"Libri recuperati con successo",没有输出实际的书籍数据 - 使用普通
HttpResponse而非DRF的Response,不符合API视图的响应规范 - 未处理作者不存在的异常,若传入的作者名不存在会直接抛出错误
- 序列化器
LibroAutoreSerializer结构不明确,若未正确关联书籍字段则无法完成序列化
修正方案
1. 定义正确的序列化器
根据需求选择对应的序列化器:
- 若仅需返回书籍列表,创建
LibroSerializer:
from rest_framework import serializers from .models import Libro class LibroSerializer(serializers.ModelSerializer): class Meta: model = Libro fields = ['id', 'titolo']
- 若需返回作者信息+关联书籍,创建包含书籍字段的
AutoreSerializer:
from rest_framework import serializers from .models import Autore, Libro class LibroSerializer(serializers.ModelSerializer): class Meta: model = Libro fields = ['id', 'titolo'] class AutoreSerializer(serializers.ModelSerializer): libri = LibroSerializer(many=True, read_only=True) class Meta: model = Autore fields = ['id', 'nome', 'libri']
2. 修正视图函数
修改视图,处理异常并返回正确的序列化数据:
from rest_framework.response import Response from rest_framework import status from django.shortcuts import get_object_or_404 from .models import Autore from .serializers import LibroSerializer # 对应上面的序列化器 @api_view(["GET"]) def libri_autore(request, nome_autore): # 自动处理作者不存在的情况,返回404响应 autore = get_object_or_404(Autore, nome=nome_autore) # 通过related_name反向查询该作者的所有书籍 libri = autore.libri.all() # 序列化书籍列表(many=True表示处理多条数据) serializer = LibroSerializer(libri, many=True) # 返回JSON格式的响应 return Response(serializer.data, status=status.HTTP_200_OK)
如果选择返回作者+书籍的结构,只需替换序列化器部分:
serializer = AutoreSerializer(autore) return Response(serializer.data)
测试效果
当请求对应URL(如/api/libri-autore/Mattia/),会返回如下格式的有效数据:
[ {"id": 1, "titolo": "Python进阶指南"}, {"id": 3, "titolo": "Django实战教程"} ]
内容的提问来源于stack exchange,提问作者Mattia
相关产品推荐
相关产品推荐

