python - 如何在 DRF 中创建发布请求
问题描述
POST
我正在drf处理这个请求,但我在某个地方丢失了它,请帮忙。
我的models.py
class TargetDefination(models.Model):
targetName=models.CharField(max_length=50)
displayName=models.CharField(max_length=100)
def __str__(self):
return self.targetName
class Target(models.Model):
targetDefn=models.ForeignKey(TargetDefination,on_delete=models.CASCADE)
roleId=models.ForeignKey(Role,on_delete=models.CASCADE)
empId=models.ForeignKey(Employee,on_delete=models.CASCADE)
startDate= models.DateField(default=datetime.date.today)
endDate= models.DateField(null=True,blank=True)
value=models.PositiveIntegerField(default=0)
def __str__(self):
return str(self.empId) + ' ' +str(self.targetDefn)
serializer.py
class TargetSerializers(serializers.ModelSerializer):
targetDefn=TargetDefinationSerializers()
roleId=RoleSerializers()
empId=OnlyEmployeeSerializers()
class Meta:
model = Target
fields = (
'id',
'targetDefn',
'roleId',
'empId',
'startDate',
'endDate',
'value'
)
这就是我尝试过的:
views.py
@api_view(['GET','POST'])
def setTarget(request, *args, **kwargs):
if request.method=='GET':
setTrgt=Target.objects.all()
serial=TargetSerializers(setTrgt,many=True)
return JsonResponse(serial.data,safe=False)
elif request.method == 'POST':
data=JSONParser().parse(request)
serial=TargetSerializers(data=data)
if serial.is_valid():
print("working")
target = serial.save()
serializer = TargetSerializers(target)
return JsonResponse(serializer.data,status=status.HTTP_200_OK,safe=False)
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我需要创建 POST 请求,格式为:
{
"id": 6,
"targetDefn": {
"id": 1,
"targetName": "MIN SALES",
"displayName": "MIN SALES"
},
"roleId": {
"id": 1,
"roleName": "CEO",
"description": "Chief executive officer",
"roleReportsTo": null,
"roleReportsToName": null
},
"empId": {
"id": 5,
"empName": "Emp05",
"startDate": "2021-05-04",
"termDate": null
},
"startDate": "2021-05-05",
"endDate": null,
"value": 123
}
这是一个仅包含值的示例。
我得到的错误:
The `.create()` method does not support writable nested fields by default.
Write an explicit `.create()` method for serializer `employee.serializers.TargetSerializers`, or set `read_only=True` on nested serializer fields.
解决方案
您必须create()
在序列化程序中实现一个方法。该方法的实现应该打破请求数据,然后将其写入其各自的模型中。
以下是如何实现该方法 -
def create(self, validated_data):
#split the objects into multiple objects.
targetDef = validated_data.pop(targetDefn)
#save the objects into its respective models.
targetDefId = TargetDefination.objects.create(**targetDef)
#get the objects of roleId and empID
role = list(validated_data['roleId'].items())
role_id = Role.objects.get(roleName =role[0][1])
emp_id = Employee.objects.get(pk=validated_data['empId']['id'])
target_obj = Target.object.create(targetDef=targetDefId, roleId=role_id, empID=emp_id, startDate=validated_data['startDate'], endDate=validated_data['endDate'], value=validated_data['value'])
return target_obj
推荐阅读
- javascript - C3 Javascript为什么子图表在移动设备中不起作用?
- powerbi - 将 SAP BW 连接到 Azure 的方法?
- c# - 使用 Selenium 和 C# 与 Chrome 打开文件对话框交互
- python - Django:有没有办法过滤模型并忽略存储的连字符?
- swift - 如何使用 Cloud Firestore 中的 GeoPoint 获取位置?
- python-3.x - 将存储的参数传递给 python 类
- javascript - 从输入文本 TypeAhead 插件中选择一个值后,如何在 div 中显示图像?
- azure - 我创建了一个带有 HttpGet 请求的 Blazor Web Assembly 应用程序,该应用程序在本地工作,但一旦发布到 Azure 就会失败
- azure - 用于 SOX 合规性的 Azure DevOps 权限层次结构
- linux - snd-soc-dummy 作为嵌入式 linux 的声卡