2016-07-27 17 views
1

所以我們有一個Django/tastypie服務器,它有以下(簡化)模型。如果我刪除了alter_detail_data_to_serialize使用tastypie改變傳入的Django url查詢:在後端處理外鍵遍歷

{ 
    "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" 
} 

使用alter,就變成:

{ 
    "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

在對象資源,您可以添加這樣的事情:

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

這是什麼正在這樣做使得PackageResource有一個變量,它的外鍵相同變量。現在你可以在PackageResource上使用api/packages?version=1.0

+0

所以它現在是: 'class PackageResource(ModelResource): branch = fields.ForeignKey(BranchResource,'branch',full = True)'我需要外鍵能夠查找值,或者是我弄錯了? 編輯:放在'fields.ForeignKey(BranchResource,'branch__version',full = True)'yield:'AttributeError:'unicode'對象沒有屬性'pk'' – TemporalWolf

+0

你可以離開'fields.ForeignKey',因爲我我不確定你在做什麼。我建議你只爲版本號添加一個新的字段到資源。這樣你可以按照你的要求傳遞參數。我會更新我的答案以進一步澄清。 – Tsangares

+0

讓我知道如果這不是完全清楚,我很樂意繼續修改,以幫助這是有道理的。 – Tsangares