如何在Django中声明含作者ID列表的Serializer字段以创建关联记录?
解决方案
你可以按以下方式在Serializer中声明该字段并处理关联记录的创建:
声明自定义输入字段:在
BookSerializer里添加一个仅用于输入的列表字段,用来接收作者ID列表。因为这个字段不属于Book模型,直接用ListField嵌套IntegerField即可,同时标记为write_only避免返回该字段。重写
create方法:先创建Book实例,再利用传入的作者ID批量生成AuthorBookAssn关联记录,提升操作效率。
完整Serializer代码示例
from rest_framework import serializers from .models import Book, AuthorBookAssn, Author class BookSerializer(serializers.ModelSerializer): # 声明作者ID列表字段,仅用于接收请求数据 author_ids = serializers.ListField( child=serializers.IntegerField(), write_only=True ) class Meta: model = Book fields = ['name', 'author_ids'] def create(self, validated_data): # 从验证数据中取出作者ID列表(Book模型无此字段,需先移除) author_ids = validated_data.pop('author_ids') # 创建书籍实例 book = Book.objects.create(**validated_data) # 批量创建关联记录 assn_records = [ AuthorBookAssn(author_id=aid, book=book) for aid in author_ids ] AuthorBookAssn.objects.bulk_create(assn_records) return book
可选优化:验证作者ID合法性
如果需要确保传入的作者ID都是数据库中存在的,可将字段改为嵌套PrimaryKeyRelatedField,自动完成存在性验证:
author_ids = serializers.ListField( child=serializers.PrimaryKeyRelatedField(queryset=Author.objects.all()), write_only=True )
此时validated_data中得到的是Author实例对象,创建关联时直接使用author=author即可。
内容的提问来源于stack exchange,提问作者akash deep
相关产品推荐
相关产品推荐

