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

Django REST Framework多对多表关系序列化问题求助

解决DRF序列化多对多关联(手动中间表)的问题

我看了你的代码,问题出在模型关联的识别和序列化器的写法上,下面一步步帮你修复:

1. 修正模型关联(可选但推荐)

你手动创建了多对多的中间表Books_Hashtags,但Django默认不会自动识别Books和Hashtags之间的关联关系。我们可以在Books模型里添加一个ManyToManyField,指定使用已有的中间表——这样不用修改数据库结构,还能让DRF更方便地处理关联:

# models.py
class Books(models.Model):
    id_books = models.AutoField(primary_key=True)
    title = models.CharField(max_length=150)
    # 添加这一行,指定关联Hashtags和中间表
    hashtags = models.ManyToManyField(Hashtags, through='Books_Hashtags', related_name='books')

class Hashtags(models.Model):
    id_hashtags = models.AutoField(primary_key=True)
    hashtag = models.CharField(max_length=150)

class Books_Hashtags(models.Model):
    id_books_hashtags = models.AutoField(primary_key=True)
    id_books = models.ForeignKey(Books, on_delete=models.CASCADE)
    id_hashtags = models.ForeignKey(Hashtags, on_delete=models.CASCADE)
    class Meta:
        unique_together = ("id_books", "id_hashtags")

2. 重写序列化器

你的序列化器存在几个明显问题:错误引用中间表序列化器而非直接关联Hashtags、字段名不匹配、错误使用many=True。修改后的序列化器如下:

# serializers.py
from rest_framework import serializers
from app.models import Books, Hashtags

class HashtagsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hashtags
        fields = ('id_hashtags', 'hashtag')  # 包含你需要返回的两个字段

class BooksSerializer(serializers.ModelSerializer):
    # 直接关联HashtagsSerializer,many=True表示单本书对应多个标签
    hashtags = HashtagsSerializer(many=True, read_only=True)
    
    class Meta:
        model = Books
        fields = ('id_books', 'title', 'hashtags')  # 完全匹配你期望的返回格式

3. 优化视图查询(避免N+1数据库查询)

为了提升接口性能,在视图的查询集里使用prefetch_related预加载关联的标签数据:

# views.py
from ntgBackend.models import Books
from rest_framework import viewsets
from api.serializers import BooksSerializer

class BooksViewSet(viewsets.ModelViewSet):
    serializer_class = BooksSerializer
    # 预加载hashtags关联数据,减少重复数据库查询
    queryset = Books.objects.all().prefetch_related('hashtags')

为什么原来的代码不生效?

  • 你的Books模型没有和Books_Hashtags建立反向关联,导致序列化器里的id_books_hashtags字段找不到对应数据
  • 中间表的序列化器写法错误:Books_Hashtags每个实例只关联一个Hashtags,不能用many=True,且字段名id_hashtag存在拼写错误(应为id_hashtags)

现在重新运行API,就能得到你期望的包含标签列表的返回格式了!

内容的提问来源于stack exchange,提问作者hernandezurbina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:16