3

私の投稿方法では、「所有者」フィールドに現在のユーザーを自動的に入力したいと思います(私は BasicAuthentication を使用しています)。ここのコードのいくつかに従いました:django-tastypieで承認されたユーザーオブジェクトを取得する方法-しかし、まだ正しく機能していません。

リソース.py:

class QuestionResource(ModelResource):
    owner = fields.ForeignKey(UserResource, 'owner')
    class Meta:
        queryset = Question.objects.all()
        allowed_methods = ['get','post']
        fields = ['title','type']
        resource_name = 'question'
        include_resource_uri = True
        serializer = PrettyJSONSerializer()
        authentication = BasicAuthentication()
        authorization = Authorization()

    def obj_create(self, bundle, request=None, **kwargs):
        bundle = self.full_hydrate(bundle, request)
        return bundle

    def obj_update(self, bundle, request=None, **kwargs):
        bundle = self.full_hydrate(bundle, request)
        return bundle

    def full_hydrate(self, bundle, request=None):
        bundle = self.hydrate(bundle, request)
        return bundle

    def hydrate(self, bundle, request=None):
        bundle.obj.owner = User.objects.get(pk = request.user.id)
        return bundle

次を発行した場合:

curl -u USERNAME:XXXXXXX --dump-header - -H "Accept: application/json" -H "Content-Type: application/json" -X POST --data "{\"title\":\"my new question\",\"type\":\"multichoice\"}" http://localhost/python/mquiz/api/v1/question/

私は応答を取得します:

HTTP/1.1 201 CREATED
Date: Fri, 02 Nov 2012 08:28:05 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Language,Cookie,Accept-Encoding
Location: http://localhost/python/mquiz/api/v1/question/None/
Content-Language: en-us
Content-Length: 0
Content-Type: text/html; charset=utf-8

したがって、すべてが機能しているように見えますが、データベースには何も追加されておらず、場所が間違っているように見えます (最後に /None/ が付いています)。

「bundle.obj.owner = User.objects.get(pk = request.user.id)」という行と関係があると確信しています。「bundle.obj.owner = request.user.id」を使用すると、エラーが発生します。

"error_message": "Cannot assign \"3L\": \"Question.owner\" must be a \"User\" instance."

bundle.obj.owner は、'/python/mquiz/api/v1/user/3/' の形式である必要があることがわかります。これを curl リクエストのデータの所有者パラメーターとして使用する場合(そして私のカスタムハイドレートメソッドを削除します)、それはすべて正常に機能し、データベースに追加されます. では、User インスタンスを受け入れられるフォームに変換するにはどうすればよいでしょうか?

どんな助けでも大歓迎です。

4

2 に答える 2

4

ああ...今それを理解しました。何がうまくいったか:

class QuestionResource(ModelResource):
    owner = fields.ForeignKey(UserResource, 'owner')
    class Meta:
        queryset = Question.objects.all()
        allowed_methods = ['get','post']
        fields = ['title','type']
        resource_name = 'question'
        include_resource_uri = True
        serializer = PrettyJSONSerializer()
        authentication = BasicAuthentication()
        authorization = Authorization()


    def hydrate(self, bundle, request=None):
        bundle.obj.owner = User.objects.get(pk = bundle.request.user.id)
        return bundle 

request.user.id だけでなく、bundle.request.user.id が必要でした。おそらく、私が見ていたもう 1 つの質問は、古いバージョンの TastyPie に関するものでした。古いバージョンでは、バンドルでリクエストにアクセスできなかったようです。

于 2012-11-02T12:10:14.790 に答える