2017-03-09 1 views
1

중첩 된 개체를 업데이트하는 데 문제가 있습니다. 그래서 나는 구조가 이것과 같은 두 개의 모델을 가지고 : 완벽 지금까지Django-Rest-Framework. 두 테이블을 업데이트 중

class EmployeeEventUserSerializer(serializers.ModelSerializer): 
class Meta: 
    model = EmployeeEvent_Users 
    fields = ('id', 'employee',) 

class EmployeeEventSerializer(serializers.ModelSerializer): 
employee_event_users = EmployeeEventUserSerializer(required=True, many=True) 

class Meta: 
    model = EmployeeEvent 
    fields = ('event_name', 'start_date', 'end_date', 'employee_event_users',) 

def create(self, validated_data): 
    request = self.context.get('request') 
    employee_event = EmployeeEvent.objects.create(
     event_name=validated_data['event_name'], 
     start_date=validated_data['start_date'], 
     end_date=validated_data['end_date'], 
     # etc ... 
    ) 
    employeeEventUsers_data = validated_data.pop('employee_event_users', []) 

    for employeeEventUser_data in employeeEventUsers_data: 
     employeeEvent_users = EmployeeEvent_Users.objects.create(
      employee_event=employee_event, 
      employee=employeeEventUser_data['employee'], 

     ) 
    employee_event.employee_event_users = employeeEventUsers_data; 
    return employee_event 


def update(self, instance, validated_data): 

    instance.event_name = validated_data['event_name'] 
    instance.start_date = validated_data['start_date'] 
    instance.end_date = validated_data['end_date'] 
    instance.save() 

    instance.employee_event_users = validated_data.get('employee_event_users') 


    if instance.employee_event_users: 
     for employee_event_user in instance.employee_event_users: 
      employee_event_user_id = employee_event_user.get('employee_id', None) 
      if employee_event_user_id: 
       emp_user = EmployeeEvent_Users.objects.get(id=employee_event_user_id, employee_event=instance) 
       emp_user.employee = employee_event_user.get('employee', emp_user.employee) 
       emp_user.save() 
      else: 
       EmployeeEvent_Users.objects.create(employee_event=instance, **employee_event_user) 

    return instance 

, 만들기 작품 및 업데이트가 작동하지 않습니다 :

class EmployeeEvent(models.Model): 
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
event_name = models.CharField(max_length=200) 
start_date = models.DateField() 
end_date = models.DateField() 


class EmployeeEvent_Users(models.Model): 
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
employee_event = models.ForeignKey(EmployeeEvent, on_delete=models.CASCADE, related_name='employee_event_employee_list') 

employee = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='employeeEvent_employee') 

나는 다음과 같은 시리얼 라이저를 작성했습니다. EmployeeEvent 테이블이 올바르게 업데이트되고 있지만 EmployeeEvent_User 테이블은 업데이트되지 않습니다. 나는 아래 논리가 맞다고 생각하지만 뭔가를 그리워한다. 어떤 도움이라도 대단히 감사 할 것입니다. 누구든지 도와 줄 수 있습니까?

답변

0

이 업데이트 방법은 더 나은 당신을 위해 작동하는 경우를 참조하십시오 :

def update(self, instance, validated_data): 
    instance.event_name = validated_data['event_name'] 
    instance.start_date = validated_data['start_date'] 
    instance.end_date = validated_data['end_date'] 

    # When updating children, I find it easier to delete them all 
    # and then re-add them instead of checking each one. It probably 
    # is not very efficient, however for small lists it should not 
    # matter much. 
    for emp in instance.employee_event_users.all(): 
     emp.delete() 

    # Now go through and re-add the EmployeeEvent_User 
    for employee_event_user in validated_data['employee_event_users']: 
     user = EmployeeEvent_Users.objects.create(employee_event=instance, **employee_event_user) 
     instance.employee_event_users.add(user) 

    instance.save() 
    return instance 

두 가지 참고 : 나는 끝에 instance.save()을 움직였다. 테스트 케이스에서 직원을 추가/편집하기 전에 인스턴스를 저장하고있었습니다. 둘째, 테스트 케이스에서 사전 형식의 개체를 employee_event_users에 할당했지만 예상 한 실제 개체는 할당하지 않았습니다. 테스트 케이스를 수정하여 새 사용자를 생성하고 목록에 추가 한 다음 저장합니다 (자식을 삭제하고 다시 추가하지 않으려는 경우). 나는 " 'EmployeeEvent'개체가 어떤 속성 'employee_event_users를'이 없습니다"오류 을 얻고, 위의 코드를 시도하는 동안

def update(self, instance, validated_data): 
    instance.event_name = validated_data['event_name'] 
    instance.start_date = validated_data['start_date'] 
    instance.end_date = validated_data['end_date'] 

    for employee_event_user in validated_data['employee_event_users']: 
     employee_event_user_id = employee_event_user.get('employee_id', None) 
     if employee_event_user_id: 
      emp_user = EmployeeEvent_Users.objects.get(id=employee_event_user_id, employee_event=instance) 
      emp_user.employee = employee_event_user.get('employee', emp_user.employee) 
      emp_user.save() 
     else: 
      user = EmployeeEvent_Users.objects.create(employee_event=instance, **employee_event_user) 
      user.save() 
      instance.employee_event_users.add(user) 

    instance.save() 
    return instance 
+0

다음은 그의 모습거야. 어떤 해결책이 있습니까? –

+0

네,'serializers.py'에서'employee_event_users'를'employeeEvent_employee'로 대체하십시오. 나는 * 그것이 당신을 위해 그것을 해결할 것이라고 생각합니다. – themanatuf

관련 문제