在Django Rest框架中使用PUT更新外键

在Django Rest框架中使用PUT更新外键,django,django-rest-framework,Django,Django Rest Framework,我基本上是Rest框架的新手,对Django来说也相对较新。我正在开发一个Employee Rest API,并使用下面的Django模型创建了Employee-Department表。我在员工的部门ID和部门ID之间分配了外键关系。现在我想使用PUT操作更新员工表。但当我更新Employee.dept_id时,它不会用新值更新。我知道,由于它是一个只读字段,我无法更新它。如何将其更改为写入字段?这样我可以更新employee表中的部门id 型号.py class Department(mode

我基本上是Rest框架的新手,对Django来说也相对较新。我正在开发一个Employee Rest API,并使用下面的Django模型创建了Employee-Department表。我在员工的部门ID和部门ID之间分配了外键关系。现在我想使用PUT操作更新员工表。但当我更新Employee.dept_id时,它不会用新值更新。我知道,由于它是一个只读字段,我无法更新它。如何将其更改为写入字段?这样我可以更新employee表中的部门id

型号.py

class Department(models.Model):
    dept_id = models.IntegerField(primary_key=True)
    dept_name = models.CharField(max_length=30)

    def __str__(self):
        return self.dept_id

    class Meta:
        ordering = ('dept_id',)


class Employee(models.Model):
    first_name = models.CharField(max_length=30,blank=True)
    last_name = models.CharField(max_length=30,null=True,blank=True)
    emp_id = models.AutoField(primary_key=True)
    hire_date = models.DateField(default=datetime.date.today)
    email_id = models.EmailField(blank=True)
    dept = models.ForeignKey(Department, null=True,blank=True,related_name="dept")

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

    class Meta:
        ordering = ('emp_id',)
class DepartmentSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Department
        fields = ('dept_id','dept_name')


class EmployeeSerializer(serializers.ModelSerializer):
    dept_id = DepartmentSerializer().get_fields()

    class Meta:
        model = Employee
        fields = ('emp_id','last_name','first_name','hire_date','email_id', 'dept_id')
@api_view(['GET','POST'])
def employee_list(request, format=None):
    """
    List all employees, or create a new employee
    """

    if request.method == 'GET':
        employees = Employee.objects.all()
        serializer = EmployeeSerializer(employees,many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = EmployeeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET','PUT','DELETE'])
def employee_detail(request, pk, format=None):
    """
    Retrieve, update or delete a employee.

    """
    try:
        employee = Employee.objects.get(pk=pk)
    except Employee.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method=='GET':
        serializer = EmployeeSerializer(employee)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = EmployeeSerializer(employee,data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method=='DELETE':
        employee.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
我的上述模型的序列化程序是

序列化程序.py

class Department(models.Model):
    dept_id = models.IntegerField(primary_key=True)
    dept_name = models.CharField(max_length=30)

    def __str__(self):
        return self.dept_id

    class Meta:
        ordering = ('dept_id',)


class Employee(models.Model):
    first_name = models.CharField(max_length=30,blank=True)
    last_name = models.CharField(max_length=30,null=True,blank=True)
    emp_id = models.AutoField(primary_key=True)
    hire_date = models.DateField(default=datetime.date.today)
    email_id = models.EmailField(blank=True)
    dept = models.ForeignKey(Department, null=True,blank=True,related_name="dept")

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

    class Meta:
        ordering = ('emp_id',)
class DepartmentSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Department
        fields = ('dept_id','dept_name')


class EmployeeSerializer(serializers.ModelSerializer):
    dept_id = DepartmentSerializer().get_fields()

    class Meta:
        model = Employee
        fields = ('emp_id','last_name','first_name','hire_date','email_id', 'dept_id')
@api_view(['GET','POST'])
def employee_list(request, format=None):
    """
    List all employees, or create a new employee
    """

    if request.method == 'GET':
        employees = Employee.objects.all()
        serializer = EmployeeSerializer(employees,many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = EmployeeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET','PUT','DELETE'])
def employee_detail(request, pk, format=None):
    """
    Retrieve, update or delete a employee.

    """
    try:
        employee = Employee.objects.get(pk=pk)
    except Employee.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method=='GET':
        serializer = EmployeeSerializer(employee)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = EmployeeSerializer(employee,data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method=='DELETE':
        employee.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
视图.py

class Department(models.Model):
    dept_id = models.IntegerField(primary_key=True)
    dept_name = models.CharField(max_length=30)

    def __str__(self):
        return self.dept_id

    class Meta:
        ordering = ('dept_id',)


class Employee(models.Model):
    first_name = models.CharField(max_length=30,blank=True)
    last_name = models.CharField(max_length=30,null=True,blank=True)
    emp_id = models.AutoField(primary_key=True)
    hire_date = models.DateField(default=datetime.date.today)
    email_id = models.EmailField(blank=True)
    dept = models.ForeignKey(Department, null=True,blank=True,related_name="dept")

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

    class Meta:
        ordering = ('emp_id',)
class DepartmentSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Department
        fields = ('dept_id','dept_name')


class EmployeeSerializer(serializers.ModelSerializer):
    dept_id = DepartmentSerializer().get_fields()

    class Meta:
        model = Employee
        fields = ('emp_id','last_name','first_name','hire_date','email_id', 'dept_id')
@api_view(['GET','POST'])
def employee_list(request, format=None):
    """
    List all employees, or create a new employee
    """

    if request.method == 'GET':
        employees = Employee.objects.all()
        serializer = EmployeeSerializer(employees,many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = EmployeeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET','PUT','DELETE'])
def employee_detail(request, pk, format=None):
    """
    Retrieve, update or delete a employee.

    """
    try:
        employee = Employee.objects.get(pk=pk)
    except Employee.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method=='GET':
        serializer = EmployeeSerializer(employee)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = EmployeeSerializer(employee,data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method=='DELETE':
        employee.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

您需要覆盖员工序列化程序中的create()和update()视图。请参阅完整的文件