2012-09-26 58 views
3

我想弄清楚我是否可以將模型字段choices表示給使用tastypie API的客戶端。在django-tastypie中,可以選擇以模式顯示嗎?

我有一個django(1.4.1)應用程序,我正在實現一個django-tastypie(0.9.11)API。我有類似如下的型號和ModelResource:

class SomeModel(models.Model): 
    QUEUED, IN_PROCESS, COMPLETE = range(3) 

    STATUS_CHOICES = (
     (QUEUED, 'Queued'), 
     (IN_PROCESS, 'In Process'), 
     (COMPLETE, 'Complete'), 
    ) 

    name = models.CharFIeld(max_length=50) 
    status = models.IntegerField(choices=STATUS_CHOICES, default=QUEUED) 

class SomeModelResource(ModelResource): 
    class Meta: 
     queryset = SomeModel.objects.all() 
     resource_name = 'some_model' 

當我看API中的對象的名稱和狀態字段顯示如下:

{ 
    ... 
    "objects":[ 
    { 
     "name": "Some name 1", 
     "status": 0 
    }, 
    { 
     "name": "Some name 2", 
     "status": 2 
    }] 
} 

我知道我可以改變SomeModelResource用水合物/脫水方法顯示如下狀態的字符串值,這將對客戶端具有更多價值:

{ 
    ... 
    "objects":[ 
    { 
     "name": "Some name 1", 
     "status": "Queued" 
    }, 
    { 
     "name": "Some name 2", 
     "status": "Complete" 
    }] 
} 

但是,客戶如何知道可用的cho不知道SomeModel的內部工作情況,爲狀態字段添加冰點?

客戶端創建系統中的對象可能不會提供狀態,因爲默認值QUEUED是可取的。但客戶端編輯對象需要知道狀態的可用選項以提供有效的選項。

我想要在SomeModelResource的模式描述中列出選項,這樣客戶端可以在創建/編輯對象時反省可用選項。但我只是不確定這是否是開箱即用的,或者我應該派tastypie來介紹這種能力。

感謝您的任何反饋!

回答

4

您可以通過覆蓋資源中的方法將選項添加到模式。如果你想的選項添加到任何領域(也許有許多的資源使用),可以按如下創建方法:

def build_schema(self): 
    base_schema = super(SomeModelResource, self).build_schema() 
    for f in self._meta.object_class._meta.fields: 
     if f.name in base_schema['fields'] and f.choices: 
      base_schema['fields'][f.name].update({ 
       'choices': f.choices, 
      }) 
    return base_schema 

我沒有測試上面的代碼,但我希望你的想法。請注意,object_class只有在您使用tastypie的ModelResource時纔會設置,因爲它是從提供的queryset中獲取的。

+0

不錯的一個... Tastypie應該默認做到這一點! – jrvidotti

+0

我的資源根本沒有調用該方法 – Harry

1

一個更簡單的解決方案是將選擇信息切入您的help_text文件夾中。

在我們的例子中,我們能夠做到:

source = models.CharField(
    help_text="the source of the document, one of: %s" % ', '.join(['%s (%s)' % (t[0], t[1]) for t in DOCUMENT_SOURCES]), 
    choices=DOCUMENT_SOURCES, 
) 

易peasy,自動保持更新,並且是幾乎無副作用。

相關問題