2014-10-16 7 views
1

django-rest-framework를 통해 장고 사용자 인스턴스를 편집 중이며 그룹 멤버쉽 설정/변경을 포함하여 잘 작동합니다. 그러나 모든 그룹에서 사용자를 지우거나 비울 수는 없습니다.Django-restframework : FormData로 ManyToMany 릴레이션을 비우거나 비우는 방법

http -j PATCH :8000/api/accounts/user/1/ groups:='[]' 

이 내가 브라우저 내에서 시도 할 것입니다 :

는 httpie와 쉘에 나를 위해 작동

var data = new FormData(); 
data.append('groups', JSON.stringify([])); // not working 

$.ajax({ 
    dataType: 'json', 
    url: '/api/accounts/user/1/', 
    type: 'PATCH', 
    processData: false, 
    contentType: false, 
    data: data 
}); 

양식 데이터가 보이는 같은 :

------WebKitFormBoundaryJu7QPC8AcBTpWEKJ 
Content-Disposition: form-data; name="groups" 

[] 

응답 :

{"groups": ["Incorrect type. Expected pk value, received unicode."]} 

답변

0

FormData가 httpie와 같은 원시 JSON을 전송할 수 없다는 것이 문제라고 생각합니다. restframework는 다르게 취급 :

def field_from_native(self, data, files, field_name, into): 
    ... 
    if self.many: 
     try: 
      # Form data 
      value = data.getlist(field_name) 
      if value == [''] or value == []: 
       raise KeyError 
     except AttributeError: 
      # Non-form data 
      value = data[field_name] 

이 사용자 정의 방법은 작동하지만 여전히 접근 방식을 싫어한다.

data.append('groups', null); 

을 그리고 백엔드에 그것을 빈 목록을 작성 : 나는 FormData에 널 (null) 추가 지우려면

class FormDataPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): 
    """ 
    Custom PrimaryKeyRelatedField which allows clearing via form-data using 
    JS's 'null' as to clearing value. 
    """ 
    def field_from_native(self, data, files, field_name, into): 
     data = dict(data) 
     if self.many: 
      if data.get(field_name) == [u'null']: 
       data[field_name] = [] 

     super(FormDataPrimaryKeyRelatedField, self).field_from_native(data, files, field_name, into) 


class UserSerializer(serializers.ModelSerializer): 

    groups = FormDataPrimaryKeyRelatedField(many=True, source='groups', required=False) 
관련 문제