2012-04-27 3 views
10

У меня есть Tastypie ModelResource, который получает свои поля из обычной модели Django. Я хотел бы сделать определенные поля доступными только для чтения на ресурсе Tastypie, хотя они могут быть записаны в базовой модели. Можно ли это сделать простым способом?Могу ли я сделать tastypie modelresource поле только для чтения?

Я попытался следующие без толку:

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

К сожалению, я забыл упомянуть, что я не мог получить вышеупомянутый «хак» для работы с ресурсами/схемы, которая генерируется Tastypie, который на самом деле то, что я после –

+2

по электронной почте Ой. Я заработал, изменив read_only только на чтение. Виноват. –

+2

не должен иметь супер-вызов у ​​вашего имени класса в нем –

ответ

4

Обычно я хотел бы сделать такого рода вещи в гидрат/обезвоживает процесс.

Есть, вероятно, и другие способы,

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

Вы правы, но я забыл упомянуть, что мне нужна схема, которую Tastypie может выводить для ресурса, чтобы отменить то, что она была только для чтения. Мое «решение» делает это для меня. –

0

Проблема заключается в том, что BaseModelForm overwrites self.instance when doing validation.

И это, конечно же, происходит независимо от того, установлено ли поле Tastypie readonly или нет (что onfly влияет на собственный Tastypie hydrate, ничего больше).

Так что я в конечном итоге это пишу: https://gist.github.com/thnee/8522224

1

Не уверен, нужно ли вам это больше, но вот ссылка на официальной документации, связанной с readonly полей.

пример:

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

Надеется, что это поможет кому-то.

Благодаря