簡體   English   中英

如何在 DRF 中創建發布請求

[英]How to create post request in DRF

我正在 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.

您必須在序列化程序中實現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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM