기본적으로 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)