Django-restframework: How to clear/empty a ManyToMany relation with FormData

djangonaut

I'm editing Django user instances via django-rest-framework, it works well, including setting/changing group membership. But I can't manage to clear/empty the user from all groups.

This works for me on the shell with httpie:

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

This is what I try within the browser:

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
});

The form data looks like:

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

[]

The response is:

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

I guess the problem is that FormData cannot transfer raw JSON like httpie. restframework treats them differently:

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]

This custom method makes it work but I still don't like the approach. To clear I append null to the FormData:

data.append('groups', null);

And make it an empty list on the backend:

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)

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

How to find django objects in a manytomany relation (with a throught)?

manytomany relation - django

ManytoMany relation in Django?

Django Count how many manytomany relation ships in an attribute

How to display value of ManytoMany model relation variable on Django Rest Framework

How to return fields of both related models in a Django ManyToMany relation?

How to access field from ManyToMany relation on top of Foreign key relation in a django serializer?

Add an object by id in a ManyToMany relation in Django

Access ManyToMany relation from model property in Django

Forward and reverse query to ManyToMany relation Django

Accessing model field in ManyToMany relation in Django

how to implement logging in django restframework?

ManyToMany relation - how update attribute in pivot table

JPA / How to add a property in a ManyToMany relation

Spring: How to POST Request into a ManyToMany Relation

How to sort a Set by its Id of a @ManyToMany relation?

How to delete a part of data in a relation ManyToMany

How to display array relation ManyToMany in symfony

How to design Restful uri for ManyToMany Relation

how to get typeorm manytomany relation column count

How to add filtered ManyToMany Field Relation

How to double check password in serializer of django restframework?

How to pass value in URL in django-restframework

how to use django restframework as a backend for mobile apps

How to post a list with django-restframework testclient

In Django RestFramework, how to change the Api Root documentation?

How to mutiple data to nested serializer in django restframework

How to get the param PK in django restframework permission?

How to return manytomanyfield as object in Django RestFramework API