所以我們有一個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_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 PackageResource(ModelResource): branch = fields.ForeignKey(BranchResource,'branch',full = True)'我需要外鍵能夠查找值,或者是我弄錯了? 編輯:放在'fields.ForeignKey(BranchResource,'branch__version',full = True)'yield:'AttributeError:'unicode'對象沒有屬性'pk'' – TemporalWolf
你可以離開'fields.ForeignKey',因爲我我不確定你在做什麼。我建議你只爲版本號添加一個新的字段到資源。這樣你可以按照你的要求傳遞參數。我會更新我的答案以進一步澄清。 – Tsangares
讓我知道如果這不是完全清楚,我很樂意繼續修改,以幫助這是有道理的。 – Tsangares