Skip to main content
 首页 » 编程设计

python之Django Tastypie 不使用 ManyToManyField 更新资源

2025年05月04日22xiaohuochai

为什么我的带有 ManyToManyField 的资源没有用这个 PUT 请求更新?

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/ 

我收到这样的回复:

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

这是我的资源:

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) 

获取 OrganizationResource 提供此交换:

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/"} 

这与 django tastypie manytomany field POST json error 非常相似,但我没有在 ManyToMany 关系上使用 through 属性。

请您参考如下方法:

原来是验证方式的问题。使用 FormValidation 意味着像/api/v1/organizations/1/这样的 uri 不会验证为 Django ORM 的 ForeignKey。使用自定义验证可以解决此问题。

许多博萨人为给我们带来这些信息而死。