【问题标题】:Django-restframework: How to clear/empty a ManyToMany relation with FormDataDjango-rest 框架:如何清除/清空与 FormData 的多对多关系
【发布时间】:2014-12-11 09:33:08
【问题描述】:

我正在通过 django-rest-framework 编辑 Django 用户实例,它运行良好,包括设置/更改组成员身份。 但我无法从所有组中清除/清空用户。

这在带有 httpie 的 shell 上对我有用:

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

这是我在浏览器中尝试的:

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."]}

【问题讨论】:

    标签: ajax django django-rest-framework


    【解决方案1】:

    我猜问题是 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]
    

    这种自定义方法使它起作用,但我仍然不喜欢这种方法。要清除我将 null 附加到 FormData:

    data.append('groups', 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)
    

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 2021-10-14
      • 2021-08-21
      • 1970-01-01
      相关资源
      最近更新 更多