使用tastypie更改传入的Django url查询:在后端处理外键遍历

时间:2016-07-27 23:07:06

标签: django tastypie

所以我们有一个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'

1 个答案:

答案 0 :(得分:1)

在对象资源中,您可以添加如下内容:

class PackageResourse(ModelResource):
    version = fields.CharField( attribute = 'branch__version' )
    class Meta:
      resource_name='package'

这是做什么使PackageResource有一个与其外键变量相同的变量。现在,您可以在api/packages?version=1.0上使用PackageResource