2012-09-26 93 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,自动保持更新,并且是几乎无副作用。

相关问题