我想弄清楚我是否可以向使用tastypie API的客户代表模型字段choices
。
我有一个django(1.4.1)应用程序,我正在实现一个django-tastypie(0.9.11)API。我有一个类似于以下的Model和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"
}]
}
但是,在不知道SomeModel的内部工作原理的情况下,客户如何知道状态字段的可用选项?
客户在系统中创建对象可能无法提供状态,因为需要QUEUED
的默认值。但是编辑对象的客户需要知道状态的可用选项以提供有效选项。
我希望在SomeModelResource的架构描述中列出选项,以便客户端可以在创建/编辑对象时内省可用的选项。但是我不确定这是否是tastypie中开箱即用的东西,或者我是否应该使用tastypie来引入该功能。
感谢您的反馈!
答案 0 :(得分: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
我没有测试过上面的代码,但我希望你能得到这个想法。请注意,仅当您使用tastypie的ModelResource时才会设置object_class
,因为它是从提供的queryset
获取的。
答案 1 :(得分:1)
更简单的解决方案是将选择信息破解到您的help_text blurb中。
在我们的例子中,我们能够做到:
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,
)
轻松自如,自动保持最新,并且几乎没有副作用。