Pergunta

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.

Foi útil?

Solução

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.

Outras dicas

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/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top