2016-08-30 2 views
0

기본적으로 Rest 프레임 워크와 Django를 처음 접하는 새로운 참가자입니다. 나는 Employee Rest API에서 일하고 있으며 아래 장고 모델을 사용하여 Employee - Department 테이블을 만들었다. 직원의 부서 ID와 부서 ID의 외래 키 관계를 할당했습니다. 이제 PUT 작업을 사용하여 Employee 테이블을 업데이트하려고합니다. 그러나 Employee.dept_id를 업데이트하면 새 값으로 업데이트되지 않습니다. 읽기 전용 입력란이므로 업데이트 할 수 없음을 이해합니다. 필드를 쓰기 위해 그것을 변경하는 방법? 그래서 나는 직원 테이블에 부서 ID를 업데이트 할 수 있습니다.Django Rest 프레임 워크에서 PUT을 사용하여 외래 키 업데이트

models.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',) 

위의 모델은 내 시리얼

serializers.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) 

답변

0

Employee Serializer에서 create() 및 update() 뷰를 덮어 써야합니다. 전체 문서는 this link을 참조하십시오.

관련 문제