我可以将一个美味的模型资源字段设为只读吗?
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)
希望这对某人有所帮助。
谢谢
【讨论】:
以上是关于我可以将一个美味的模型资源字段设为只读吗?的主要内容,如果未能解决你的问题,请参考以下文章