django - 在 Django Rest Framework 中使用 PUT 更新外键

标签 django django-rest-framework

我基本上是 Rest 框架的新手,对 Django 还比较陌生。我正在开发一个 Employee Rest API,我使用以下 Django 模型创建了 Employee - Department 表。我在 Employee's-department ID 和 Department-department ID 之间分配了一个外键关系。现在我想使用 PUT 操作更新 Employee 表。但是当我更新 Employee.dept_id 时,它不会更新为新值。我知道由于它是一个只读字段,因此无法更新它。如何将其更改为写入字段?这样我就可以更新员工表中的部门 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',)

我的上述模型的序列化器是

序列化器.py

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')

views.py

@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)

最佳答案

您需要覆盖 Employee Serializer 中的 create() 和 update() View 。请引用this link获取完整文档。

关于django - 在 Django Rest Framework 中使用 PUT 更新外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39230535/

相关文章:

php - 如何结合 Prestashop (PHP) 和 DjangoCMS (Python)

python - 如何用 Django 创建两个缩略图?

python - request.POST 中的每个值都是一个列表

django - 序列化器处理嵌套对象

python - 具有自定义多对多映射的 Django 序列化模型

python - 如何使用 Python API 在 Google Cloud Storage 上上传文件夹

python - 持久性 "CSRF token missing or incorrect."。 Jinja 和 django 注册设置

python - Django Restful 模型外键 - 指定 From 和 To 字段

python - Django Rest Framework 不序列化 SerializerMethodField

python - 我如何处理 django 嵌套模型?