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

如何在Django REST Framework中创建带多个关联电话号码的联系人

一次性创建联系人与多个电话号码的实现方案

嘿,你已经在序列化器里配置好了嵌套创建的基础结构,只需要按正确格式构造请求数据,再微调下序列化器的小问题,就能实现需求啦!

1. 正确的请求数据格式

不管用Postman、curl还是前端发请求,把JSON格式的请求体写成这样就行:

{
  "first_name": "John",
  "last_name": "Doe",
  "date_of_birth": "1990-01-01",
  "phone_numbers": [
    {
      "phone": "+1234567890",
      "primary": true
    },
    {
      "phone": "+0987654321",
      "primary": false
    }
  ]
}

这里的phone_numbers对应你序列化器里定义的字段名,数组里每个元素就是一条电话号码的信息,包含phone和primary字段。

2. 修复序列化器的小bug

看了你的ContactSerializer的create方法,有个小问题需要调整:

# 原代码里的问题行
user = validated_data.pop('user_id')

因为你用了serializers.CurrentUserDefault(),它会直接把当前用户放到validated_data的user键里,而不是user_id。修改后的create方法应该是这样:

def create(self, validated_data):
    # 取出电话号码数据,注意这里的键是contactphonenumber_set,对应你设置的source
    phone_numbers = validated_data.pop('contactphonenumber_set')
    # 直接创建联系人,validated_data里已经包含user了
    instance = Contact.objects.create(**validated_data)
    # 批量创建电话号码
    for phone_data in phone_numbers:
        ContactPhoneNumber.objects.create(contact=instance, **phone_data)
    return instance

另外注意:你的ContactPhoneNumber模型里没看到created和modified字段,但序列化器里却把它们加到了fields里,这会导致序列化报错。你要么给模型加上这两个字段:

# 在ContactPhoneNumber模型里添加
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)

要么从ContactPhoneNumberSerializer的fields里去掉这两个字段。

3. 请求发送说明

发送POST请求到你的ContactViewSet对应的URL(比如/api/contacts/),请求头设置Content-Type: application/json,同时带上用户的认证凭证(因为你设置了IsAuthenticated权限)。

这样就能一次性完成联系人和多个关联电话号码的创建啦!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:22