加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django – 如何通过tastypie公开manytomany字段作为资源?

发布时间:2020-12-20 13:27:35 所属栏目:Python 来源:网络整理
导读:在我当前的代码中,用户有一个他加入的目标列表.我希望API端点公开所有用户的加入目标.我希望能够发布,放置和访问此API端点.它将获得已加入目标的列表,向已加入目标列表添加目标,或对已加入目标列表进行更新. # Joined Goal Resourceclass JoinedGoalResource
在我当前的代码中,用户有一个他加入的目标列表.我希望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不起作用

解决方法

解决方案可以非常简单.

您可以实现常规资源(忘记用户所有权),然后按照“Creating per-user resources” section of Tastypie cookbook缩小GET返回的列表,并确保新创建的对象归当前用户所有(POST).

关于PUT,您只需要授权类,以确保用户仅被授权更新他/她自己的目标.这是最棘手的部分(但并不难),只要确保目标包的user属性值与request.user相同,当方法是PUT时否则引发异常并且你已经完成了:)

所以在上面你有以下URI:

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

你可以介绍(对于GET):

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

按照Nested Resources section of the cookbook

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读