在我当前的代码中,用户有一个他加入的目标列表。我希望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端点上,它将影响UserProfile而不是用户的joined_goals。
编辑: 我已经更改了我的代码,以便加入的资源覆盖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不起作用答案 0 :(得分:1)
解决方案非常简单。
您可以实现常规资源(忘记用户所有权),然后按照"Creating per-user resources" section of Tastypie cookbook缩小GET返回的列表范围,并确保新创建的对象归当前用户所有(POST)。
关于PUT,您只需要授权类,以确保用户仅被授权更新他/她自己的目标。这是最棘手的部分(但并不难),只要确保user
包的goal
属性的值与方法是PUT时request.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