如何在DRF中创建post请求

2024-06-16 09:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在drf中处理这个POST请求,我把它丢在了某个地方,请帮忙

我的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.

Tags: selfiddatareturnonmodelsserialpost
1条回答
网友
1楼 · 发布于 2024-06-16 09:24:20

您必须在序列化程序中实现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

相关问题 更多 >