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.
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.
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/
来源:https://stackoverflow.com/questions/11442521/django-tastypie-not-updating-resource-with-manytomanyfield