我可以将一个美味的模型资源字段设为只读吗?

Posted

技术标签:

【中文标题】我可以将一个美味的模型资源字段设为只读吗?【英文标题】: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 【参考方案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)

希望这对某人有所帮助。

谢谢

【讨论】:

以上是关于我可以将一个美味的模型资源字段设为只读吗?的主要内容,如果未能解决你的问题,请参考以下文章

Django管理界面中的只读模型?

我可以将 Xcode 项目设为只读,即阻止它修改文件吗?

如何将 Django 模型设为只读?

Django admin:将必填字段设为只读

HTML 可以在 Internet Explorer 中将文本区域设为“只读”吗?

JAXB 可以创建“只读”类属性吗?