使用 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_serializealter_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