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

DRF中POST请求无法同步存储Person关联Followers外键数据问题

解决DRF中POST请求无法同时创建Person及关联Followers数据的问题

问题根源

你在PersonSerializer中将followers字段设置为read_only=True,这会让DRF在处理POST请求时忽略该字段的传入数据,导致关联的Followers记录不会被创建,最终followers字段为null。

解决方案

要实现同时创建Person和关联的Followers数据,需要移除read_only=True,并在序列化器中重写create方法,手动处理嵌套数据的保存逻辑。

1. 模型定义(参考你的结构)

# models.py
from django.db import models

class Followers(models.Model):
    id = models.AutoField(primary_key=True)
    follower_count = models.IntegerField(verbose_name="粉丝数")

class Person(models.Model):
    name = models.CharField(max_length=100, verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    followers = models.ForeignKey(Followers, on_delete=models.CASCADE, null=True, verbose_name="关联粉丝数据")

2. 修改序列化器

移除followers字段的read_only=True,并重写create方法来分步创建Followers和Person:

# serializers.py
from rest_framework import serializers
from .models import Person, Followers

class FollowerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Followers
        fields = ["id", "follower_count"]

class PersonSerializer(serializers.ModelSerializer):
    # 移除read_only=True,允许传入嵌套数据
    followers = FollowerSerializer()

    class Meta:
        model = Person
        fields = ["id", "name", "age", "followers"]

    def create(self, validated_data):
        # 从验证后的数据中提取followers嵌套数据
        follower_data = validated_data.pop("followers")
        # 创建Followers记录
        follower_instance = Followers.objects.create(**follower_data)
        # 创建Person并关联已创建的Followers实例
        person_instance = Person.objects.create(followers=follower_instance, **validated_data)
        return person_instance

3. 视图保持原有逻辑即可

如果使用ModelViewSet或CreateAPIView,只需指定修改后的序列化器:

# views.py
from rest_framework import viewsets
from .models import Person
from .serializers import PersonSerializer

class PersonViewSet(viewsets.ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

4. POST请求示例(Postman中使用JSON格式)

{
    "name": "张三",
    "age": 28,
    "followers": {
        "follower_count": 1500
    }
}

额外说明

  • 如果需要支持更新操作(PUT/PATCH),还需要在PersonSerializer中重写update方法,处理Followers数据的更新逻辑。
  • 如果存在Followers数据复用的场景,可以在create方法中先查询是否已有对应follower_count的记录,避免重复创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:14