如何在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
相关产品推荐
相关产品推荐

