如何在Tastypie中正确获取相关资源?

时间:2014-04-02 17:32:10

标签: django tastypie

我目前正在尝试使用Tastypie设计一个API,但是一旦我处理相关的模型和资源,我就会遇到诸如“我应该使用full=true之类的设计问题吗?为什么?” 如果帖子很长,请不要担心,这只是因为我试图解释一些事情:)

让我们以3个相关资源为例:

class UserResource(ModelResource):
    class meta():
        queryset = User.objects.all()
        resource_name = 'users'
        # Some other required fields

class ClientUserResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user') # I could add full=True

    class meta():
        queryset = ClientUser.objects.all()
        resource_name = 'client_users'
        # Some other required fields

class CardResource(ModelResource):
    linked_client = fields.ForeignKey(ClientResource, 'linked_client') # I could add full=True

    class meta():
        queryset = Card.objects.all()
        resource_name = 'cards'
        # Some other required fields

使用这3个相关资源进行简单的GET请求来获取信息没有问题。 但现在,假设每个资源都有自定义授权,验证以及其他覆盖方法,如obj_get_list()dehydrate()

如果我想获得卡及其用户的信息(我们假设我们需要的数据分布在3个资源上),让我们描述一下我们所拥有的不同解决方案:

解决方案A - > 1个请求,使用FK字段中的full=True

"http://myapp/api/v1/cards/42"上的GET请求将为我提供所需的所有信息。 然而,在这种情况下,永远不会调用UserResource和ClientUserResource的自定义Authorization方法。这意味着API用户将访问他们不应访问的信息。当然我可以在CardResource的授权方法中管理它,但它确实是一件坏事(不是干,不是它的角色)

解决方案B - > 3个'嵌套'级别的请求,FK字段中的full=False

  • "http://myapp/api/v1/cards/42"的GET请求为我提供了支持 链接ClientUserResource。
  • ClientUserResource 的URI的GET请求为我提供了链接UserResource的uri
  • UserResource 的URI的GET请求为我提供了我需要的数据 UserResource

我可以看到解决方案B的两个问题:

  • 效果:如果我的模型更复杂,我需要执行大量请求
  • 安全性:即使它没有解决方案1那么糟糕,当你在列表上发出GET请求,当答案是空列表,或者包含uris的列表(uris包含id)时,它已经是一个信息。

在这种情况下,您会使用什么解决方案?你能看到更好的方法吗? 感谢。

1 个答案:

答案 0 :(得分:0)

您确定"custom Authorization method of UserResource and ClientUserResource will never be called"吗?

每个资源都有自己的身份验证,授权和验证,并且tastypie会在发生错误时立即返回错误。

如果full=True所有外键或多对多键都没有问题,只要不是REVERSE RELATION。当然,这样你的结果可能非常复杂。

如果您想限制用户不接收某些机密字段,可以在dehydratefull_dehydrate功能中执行此操作。