Могу ли я сделать tashypie modelresource поле только для чтения?
У меня есть 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
Ответы
Ответ 1
Обычно я делал бы такие вещи в процессе гидратации/обезвоживания.
Есть, вероятно, другие способы,
def hydrate(self, bundle):
if bundle.obj.pk:
bundle.data['somefield'] = bundle.obj.somefield
else:
bundle.data.pop('somefield')
return super(MyResource, self).hydrate(bundle)
Ответ 2
Не уверен, что вам это нужно больше, но здесь ссылка на официальную документацию, относящуюся к readonly полям.
Пример:
class ResourceA(ModelResource):
read_only_field = fields.DateTimeField('attribute', readonly=True)
Надеюсь, это поможет кому-то.
Спасибо
Ответ 3
Проблема заключается в том, что BaseModelForm перезаписывает self.instance при выполнении проверки.
И это происходит независимо от того, установлено ли поле Tastypie readonly
или нет (что onfly влияет на Tastypie own hydrate
, ничего больше).
Итак, я написал это: https://gist.github.com/thnee/8522224