1

リソースを更新しようとすると、このエラーが発生し続けます。

更新しようとしているリソースはメッセージと呼ばれます。アカウントには外部キーがあります。

class AccountResource(ModelResource):
    class Meta:
        queryset = Account.objects.filter()
        resource_name = 'account'
        '''
        set to put because for some weird reason I can't edit 
        the other resources with patch if put is not allowed.
        '''
        allowed_methods = ['put']
        fields = ['id']


    def dehydrate(self, bundle):
        bundle.data['firstname'] = bundle.obj.account.first_name   
        bundle.data['lastname'] = bundle.obj.account.last_name
        return bundle

class MessageResource(ModelResource):
    account = fields.ForeignKey(AccountResource, 'account', full=True)

    class Meta:
        queryset = AccountMessage.objects.filter(isActive=True)
        resource_name = 'message'
        allowed = ['get', 'put', 'patch', 'post']
        authentication = MessageAuthentication()
        authorization = MessageAuthorization()   
        filtering = {
                     'account' : ALL_WITH_RELATIONS
                     }

PATCHを使用してメッセージを更新しようとすると、次のエラーが発生します。

渡されたデータ{"text":"blah!"}

The 'account' field has was given data that was not a URI, not a dictionary-alike and does not have a 'pk' attribute: <Bundle for obj: '<2> [nikunj]' and with data: '{'lastname': u'', 'id': u'2', 'firstname': u'', 'resource_uri': '/api/v1/account/2/'}'>.

悪い解決策::

データ{"text":"blah!", "account":{"pk":2}} を渡す:アカウントを渡したくありません。テキストだけを編集したいだけです。アカウントも渡す必要があるのはなぜですか?

私は使用しようとしました:

def obj_update(self, bundle, request=None, **kwargs):
        return super(ChartResource, self).obj_update(bundle, request, account=Account.objects.get(account=request.user))

しかし、それは動作しません!! ヘルプ!

4

2 に答える 2

6

PUT メソッドを使用しているため、Tastypie は、obj_update メソッドを呼び出すときに bundle.data オブジェクト内の「account」フィールドを想定しています。

また、obj_update のキーワード引数は、obj_create のように値を設定するために使用されるのではなく、問題のオブジェクトを検索するために使用されます。したがって、account=Account... キーワード引数を渡すときは、単に obj_create メソッドに AccountMessage テーブル内を検索してアカウントでフィルター処理するように指示しているだけです。

この問題を解決する 1 つの方法は、読み取り専用値を True に設定することです。

Class MessageResource(ModelResource):
    account = fields.ForeignKey(AccountResource, 'account', full=True,
                                readonly=True)

メッセージの作成時にアカウントを設定する必要がある場合は、obj_create メソッドで設定することをお勧めします

def obj_create(self, bundle, request=None, **kwargs):
    account = Account.objects.get(account=request.user)
    return super(MessageResource,
                 self).obj_create(bundle, request, account=account, **kwargs)

あなたのコードから理解できることから、アカウントの値はメッセージの作成者を指しているため、ユーザーではなくシステムによって設定される必要があるため、これはより良い解決策のようです。

于 2012-10-27T16:55:41.347 に答える
0

full=True が含まれていないリソースで試してください。Tastypie では、 full=True を含むリソースに対して、いくつかの異なる期待があります。主に、レコード全体が含まれることです。これには子リソースも含まれると思います。

于 2012-07-13T15:04:41.977 に答える