You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:12:32