所以我们有一个Django / tastypie服务器,它具有以下(简化)模型。如果我删除了alter_detail_data_to_serialize
:
{
"release": false,
"resource_uri": "/api/packages/1",
"id": 1,
"branch": {
"resource_uri": "/api/branches/1",
"id": 1,
# ... more bits the client doesn't need to know about
"version": "0.1"
},
"revision": "72"
}
随着改变,它变成:
{
"release": false,
"branch": "0.1",
"revision": "72"
}
我们希望通过API使用它:它删除了外键遍历以简化JSON并毫无问题地执行任何CRUD:提供version
足以识别分支。问题是,要查询这个,需要
/api/packages?branch__version=1.0
,这不直观,并暴露了底层数据库的结构。我们更愿意查询:
/api/packages?branch=1.0
并处理后端的外键遍历。
alter_detail_data_to_serialize
和alter_deserialized_detail_data
允许我与简化的JSON进行交互,并且可以毫无问题地执行任何非搜索CRUD,但是是否可以允许/api/packages?branch=1.0
查询并拥有django / tastypie服务器将其更正为/api/packages?branch__version=1.0
,隐藏数据库结构?
可能相关的一些其他代码:
class PackageResource(ModelResource):
branch = fields.ForeignKey(BranchResource, 'branch', full=True)
class Meta:
queryset = Packages.objects.all()
resource_name = 'packages'
collection_name = 'packages'
def alter_detail_data_to_serialize(self, request, data):
data.data['branch'] = data.data['branch'].data['version']
return data
分支资源:
class BranchResource(ModelResource):
class Meta:
queryset = Branches.objects.all()
resource_name = 'branches'
collection_name = 'branches'
答案 0 :(得分:1)
在对象资源中,您可以添加如下内容:
class PackageResourse(ModelResource):
version = fields.CharField( attribute = 'branch__version' )
class Meta:
resource_name='package'
这是做什么使PackageResource
有一个与其外键变量相同的变量。现在,您可以在api/packages?version=1.0
上使用PackageResource
。