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

如何在Django中声明含作者ID列表的Serializer字段以创建关联记录?

解决方案

你可以按以下方式在Serializer中声明该字段并处理关联记录的创建:

  1. 声明自定义输入字段:在BookSerializer里添加一个仅用于输入的列表字段,用来接收作者ID列表。因为这个字段不属于Book模型,直接用ListField嵌套IntegerField即可,同时标记为write_only避免返回该字段。

  2. 重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:06:27