1

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 属性を使用していません。

4

2 に答える 2

7

問題は検証方法であることが判明しました。FormValidation を使用すると、/api/v1/organizations/1/ のような uri は Django ORM の ForeignKey として検証されません。代わりにカスタム検証を使用すると、問題が修正されます。

この情報を私たちにもたらすために、多くのボサンが亡くなりました。

于 2012-07-16T17:59:29.990 に答える
2

ManyToManyFieldinDeviceResourceForiegnKeyin の両方OrganizationResourceを beに設定したようですfull=True

そのため、PUT を実行する場合、Tastypie は完全なオブジェクトが与えられるか、少なくとも resource_uri を持つ「空白の」オブジェクトが期待されます。

{"resource_uri" : "/api/v1/organizations/1/"}uri ie: の代わりに、resource_uri を指定してオブジェクト自体を送信してみてください。 "/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/
于 2012-07-12T01:00:59.927 に答える