我目前正在尝试使用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。我可以看到解决方案B的两个问题:
在这种情况下,您会使用什么解决方案?你能看到更好的方法吗? 感谢。
答案 0 :(得分:0)
您确定"custom Authorization method of UserResource and ClientUserResource will never be called"
吗?
每个资源都有自己的身份验证,授权和验证,并且tastypie会在发生错误时立即返回错误。
如果full=True
所有外键或多对多键都没有问题,只要不是REVERSE RELATION。当然,这样你的结果可能非常复杂。
如果您想限制用户不接收某些机密字段,可以在dehydrate或full_dehydrate功能中执行此操作。