【问题标题】:In django-tastypie, can choices be displayed in schema?在 django-tastypie 中,可以在模式中显示选择吗?
【发布时间】:2012-09-18 15:05:02
【问题描述】:

我正在尝试确定是否可以将模型字段 choices 表示给使用美味派 API 的客户。

我有一个 django (1.4.1) 应用程序,我正在为其实现一个 django-tastypie (0.9.11) API。我有一个类似于以下的模型和模型资源:

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 的架构描述中,以便客户端可以在创建/编辑对象时内省可用的选项。但我只是不确定这是否是可口可乐的开箱即用的东西,或者我是否应该分叉美味派来引入该功能。

感谢您的任何反馈!

【问题讨论】:

    标签: python django api tastypie


    【解决方案1】:

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

    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 将仅在您使用来自提供的 queryset 的美味馅饼的 ModelResource 时设置。

    【讨论】:

    • 不错... Tastypie 应该默认这样做!
    • 我的资源根本没有调用该方法
    【解决方案2】:

    一个更简单的解决方案是将选择信息破解到您的 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,
    )
    

    简单易用,自动保持最新状态,几乎没有副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多