使用 tastypie 改变传入的 Django url 查询:在后端处理外键遍历
Altering incoming Django url queries using tastypie : handling foreign key traversal on the backend
所以我们有一个 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'
在对象资源中,你可以这样添加:
class PackageResourse(ModelResource):
version = fields.CharField( attribute = 'branch__version' )
class Meta:
resource_name='package'
这是做什么的,它使 PackageResource
有一个与其外键变量相同的变量。现在您可以在 PackageResource
.
上使用 api/packages?version=1.0
所以我们有一个 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'
在对象资源中,你可以这样添加:
class PackageResourse(ModelResource):
version = fields.CharField( attribute = 'branch__version' )
class Meta:
resource_name='package'
这是做什么的,它使 PackageResource
有一个与其外键变量相同的变量。现在您可以在 PackageResource
.
api/packages?version=1.0