【问题标题】:How to expose manytomany field as a resource with tastypie?如何使用美味派将多线程字段公开为资源?
【发布时间】:2012-04-11 01:54:08
【问题描述】:

在我当前的代码中,用户有一个他加入的目标列表。我想要一个 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 不起作用

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    解决方案非常简单。

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

    关于 PUT,您只需要授权类来确保用户只被授权更新他/她自己的目标。这是最棘手的部分(但并不难),只需确保 goal 捆绑包的 user 属性的值与 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
    

    关注Nested Resources section of the cookbook

    【讨论】:

    • 很高兴看到关于“最棘手的部分”的解决方案,因为像这样的问题越来越多 Q1 Q2 Q1 是我在 stackoverflow 上注册的原因:)跨度>
    • 所以有人应该发布一个好问题。这个问题是关于如何暴露对象以及如何与它们交互的,我想我已经回答了。我还提供了有关如何实施您提到的部分的指南。这并不难,只需要一点点努力就可以了解 ModelResource 是如何工作的以及什么叫什么,所以如果您愿意,请提出问题,向我们展示您尝试过的内容以及遇到问题的地方,我很乐意帮助。 SO 并不是“为我写代码”的网站。
    • 我认为我在 3 个月前完成了第一季度的每一点。
    • @kgr,在 obj_create 下,由于我要添加到用户配置文件的列表中,我实际上并没有创建任何新对象,我如何让捆绑包返回?我在主帖中添加了一些代码。
    • @egidra,您将该代码放在哪个资源中?你有我提议的两个资源(UserGoal)吗?我看到您继承自 ModelResource,因此您不必手动编写 obj_create,除了食谱中显示的内容(这属于 Goal 资源)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多