编程语言
首页 > 编程语言> > python – 在django-tastypie中,可以在架构中显示选项吗?

python – 在django-tastypie中,可以在架构中显示选项吗?

作者:互联网

我试图弄清楚我是否可以为使用tastypie API的客户代表模型字段选择.

我有一个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
    }]
}

我知道我可以使用hydrate / dehydrate方法改变SomeModelResource,以显示状态的字符串值,如下所示,这将为客户提供更多价值:

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

但是,如果不了解SomeModel的内部工作原理,客户如何知道状态字段的可用选择?

在系统中创建对象的客户端可能无法提供状态,因为需要QUEUED的默认值.但是编辑对象的客户端需要知道状态的可用选项以提供有效选项.

我想在SomeModelResource的模式描述中列出选项,因此客户端可以在创建/编辑对象时内省可用的选择.但我不确定这是否是tastypie中开箱即用的东西,或者我是否应该使用tastypie来引入该功能.

感谢您的任何反馈!

解决方法:

您可以通过覆盖资源中的方法将选项添加到架构中.如果您想将选项添加到任何字段(可能与许多资源一起使用),您可以按如下方式创建方法:

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,因为它是从提供的查询集中获取的.

标签:python,django,api,tastypie
来源: https://codeday.me/bug/20190901/1785479.html