4

私の現在のコードでは、ユーザーは自分が参加した目標のリストを持っています。APIエンドポイントで、ユーザーが参加しているすべての目標を公開したいと思います。このAPIエンドポイントに投稿、配置、およびアクセスできるようにしたいと考えています。参加した目標のリストを取得したり、参加した目標リストに目標を追加したり、参加した目標リストを更新したりします。

# Joined Goal Resource
class JoinedGoalResource(ModelResource):
  user = fields.ForeignKey(UserResource, 'user')
  joined_goals = fields.ManyToManyField(GoalResource, 'joined_goals', full=True)

  class Meta:
    authentication = Authentication()
    authorization = Authorization()
    queryset = UserProfile.objects.all()
    resource_name = 'joined_goal'
    allowed_methods = ['get', 'post', 'put']
    filtering = {
      'user': ALL_WITH_RELATIONS
    }

上記のコードの問題は、クエリセットとしてUserProfileモデルを使用しているため、APIエンドポイントを投稿、取得、または配置すると、ユーザーのjoined_goalsではなくUserProfileに影響することです。

編集:結合されたリソースがobj_createメソッドをオーバーライドし、ログインしたユーザーの結合された目標リストに追加するようにコードを変更しました。問題は、メソッドがバンドルを返す必要があることです。返品するバンドルを作成するにはどうすればよいですか?私はこのようなことをしています:

goal_resource = GoalResource
goal_obj = goal_resource.obj_get(pk=1)
goal_bundle = goal_resource.build_bundle(obj=goal_obj, request=request)
return goal_bundle

ただし、pk = 1の引数を取ると、obj_getは機能しません。

4

1 に答える 1

1

解決策は非常に簡単です。

通常のリソース(ユーザーの所有権を忘れる)を実装してから、Tastypieクックブックの「ユーザーごとのリソースの作成」セクションに従ってGETによって返されるリストを絞り込み、新しく作成されたオブジェクトが現在のユーザー(POST)によって所有されていることを確認できます。 。

PUTに関しては、ユーザーが自分の目標を更新することのみを許可されることを保証する許可クラスが必要です。これは最もトリッキーな部分です(ただし難しいことではありません)。メソッドがPUTの場合、バンドルのuser属性の値が同じであることを確認してください。そうでない場合は、例外が発生し、完了です:)goalrequest.user

したがって、上記を使用すると、次のURIが得られます。

GET,POST,PUT /api/users/ #for interaction with Users
GET,POST,PUT /api/user-goals/ #for interaction with Goals

そしてあなたは(GETのために)紹介することができます:

GET /api/users/goals/ #for displaying user goals in more natural way

クックブックのネストされたリソースのセクションに従う

于 2012-04-11T13:38:38.480 に答える