Question

Why doesn't my resource with a ManyToManyField update with this PUT request?

curl --dump-header - -H "Content-Type: application/json" -X PUT --data '{"uuid":"blah","pass_token":"blah","favorites": ["/api/v1/organizations/1/"]}' http://localhost:8000/api/v1/devices/2/

I get this response:

HTTP/1.0 400 BAD REQUEST
Date: Wed, 11 Jul 2012 22:21:15 GMT
Server: WSGIServer/0.1 Python/2.7.2
Content-Type: application/json; charset=utf-8

{"favorites": ["\"/api/v1/organizations/1/\" is not a valid value for a primary key."]}

Here are my resources:

class OrganizationResource(ModelResource):
    parent_org = fields.ForeignKey('self','parent_org',null=True, full=True,blank=True)

    class Meta:
        allowed_methods = ['get',]
        authentication = APIAuthentication()
        fields = ['name','org_type','parent_org']
        filtering = {
            'name': ALL,
            'org_type': ALL,
            'parent_org': ALL_WITH_RELATIONS,
        }
        ordering = ['name',]
        queryset = Organization.objects.all()
        resource_name = 'organizations'

class DeviceResource(ModelResource):
    favorites = fields.ManyToManyField(OrganizationResource,'favorites',null=True,full=True)

    class Meta:
        allowed_methods = ['get','patch','post','put',]
        authentication = APIAuthentication()
        authorization = APIAuthorization()
        fields = ['uuid',]
        filtering = {
            'uuid': ALL,
        }
        queryset = Device.objects.all()
        resource_name = 'devices'
        validation = FormValidation(form_class=DeviceRegistrationForm)

A get on the OrganizationResource gives this exchange:

curl --dump-header - -H "Content-Type: application/json" -X GET http://localhost:8000/api/v1/organizations/1/

HTTP/1.0 200 OK
Date: Wed, 11 Jul 2012 22:38:30 GMT
Server: WSGIServer/0.1 Python/2.7.2
Content-Type: application/json; charset=utf-8

{"name": "name", "org_type": "org_type", "parent_org": null, "resource_uri": "/api/v1/organizations/1/"}

This is very similar to django tastypie manytomany field POST json error, but I am not using a through attribute on my ManyToMany relationship.

Était-ce utile?

La solution

The problem turned out to be the validation method. Using FormValidation means that a uri like /api/v1/organizations/1/ won't validate as a ForeignKey for the Django ORM. Using a custom validation instead fixes the issue.

Many Bothans died to bring us this information.

Autres conseils

Looks like you set both ManyToManyField in DeviceResource and ForiegnKey in OrganizationResource to be full=True.

So when doing a PUT Tastypie expects a full object given to it or at the very least a "blank" object with resource_uri for it.

Try sending in object itself with resource_uri specified instead of just the uri i.e.: {"resource_uri" : "/api/v1/organizations/1/"} instead of "/api/v1/organizations/1/"

curl --dump-header - -H "Content-Type: application/json" -X PUT --data '{"uuid":"blah","pass_token":"blah","favorites": [{"resource_uri" : "/api/v1/organizations/1/"}]}' http://localhost:8000/api/v1/devices/2/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top