【问题标题】:Can I make a tastypie modelresource field read-only?我可以将一个美味的模型资源字段设为只读吗?
【发布时间】:2012-05-08 11:01:02
【问题描述】:

我有一个 Tastypie ModelResource,它从常规 Django 模型中获取其字段。我想让 Tastypie 资源上的某些字段只读,即使它们在底层模型中是可写的。这可以通过简单的方式完成吗?

我尝试了以下方法无济于事:

def __init__(self, **kwargs):
    super(ModelResource, self).__init__(**kwargs)
    for f in getattr(self.Meta, 'read_onlys', []):
        self.fields[f].read_only = True

【问题讨论】:

  • 对不起,我忘了提到我无法让前面提到的“hack”与 Tastypie 生成的资源/模式一起工作,这正是我所追求的
  • 哎呀。我通过将 read_only 更改为 readonly 来实现它。我的错。
  • 超级调用中不应该有你的类名
  • 托洛梅亚:你说得对。我以前犯过这个错误。我希望有一种更简单/更短的方法来调用超类而不使用 super(MyClass, self) 或 SuperClass.foo(self)。
  • 等待 python 3,super 将神奇地对调用类和实例变得聪明。 docs.python.org/3.1/library/functions.html#super

标签: tastypie


【解决方案1】:

通常我会在水合物/脱水过程中做那种事情。

可能还有其他方法,

def hydrate(self, bundle):
    if bundle.obj.pk:
        bundle.data['somefield'] = bundle.obj.somefield
    else:
        bundle.data.pop('somefield', None)  # no KeyError if 'somefield' missing

    return super(MyResource, self).hydrate(bundle)

【讨论】:

  • 你说得对,但我忘了提到我希望 Tastypie 可以为资源输出的架构反映它是只读的。我的“解决方案”为我做这件事。
【解决方案2】:

问题是BaseModelForm overwrites self.instance when doing validation

不管 Tastypie 字段是否设置了readonly,这当然会发生(这只影响 Tastypie 自己的hydrate,没有别的)。

所以我最终写了这个:https://gist.github.com/thnee/8522224

【讨论】:

    【解决方案3】:

    不确定您是否需要这个,但这里是与readonly 字段相关的官方文档的链接。

    示例:

    class ResourceA(ModelResource):
        read_only_field = fields.DateTimeField('attribute', readonly=True)
    

    希望这对某人有所帮助。

    谢谢

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2012-09-25
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多