2012-05-21 6 views

Respuesta

14

Debería especificar todos los campos en el ModelResource real y luego anular el método get_list para filtrar solo los campos que desea mostrar. Consulte la implementación interna de get_list en Resource para ver cómo sobrescribirlo.

Sin embargo, tenga en cuenta que esto solo se aplica a las solicitudes GET, aún así debería POST/PUT/PATCH en el recurso con todos los campos si los límites de autorización le permiten hacerlo.

En una cáscara de tuerca, desea parchear en caliente la lista de campos internos antes de llamar a full_dehydrate en todos los objetos ORM devueltos por obj_get_list.

Como alternativa, puede dejar que se produzca el mecanismo de deshidratación completo y al final eliminar los campos que no desea mostrar si no le preocupa exprimir tanto como sea posible. Por supuesto, tendría que hacer esto solo si se invoca la URL como consecuencia de la llamada get_list. Hay un método de conveniencia para este alter_list_data_to_serialize(request, to_be_serialized).

Just Do:

class SomeResource(Resource): 
    class Meta(...): 
     ... 
     field_list_to_remove = [ 'field1', 'field2' ] 
     ... 

    def alter_list_data_to_serialize(request, to_be_serialized): 
     for obj in to_be_serialized['objects']: 
      for field_name in self._meta.field_list_to_remove: 
       del obj.data[field_name] 
     return to_be_serialized 
+0

Esta es una buena idea, y agradezco su respuesta. Me pregunto, sin embargo, si hay una manera de diferir los campos de la consulta original para evitar el envío de algunos campos bastante grandes a través del cable. – Carson

+1

Entonces le sugiero que simplemente cree 2 recursos, uno que muestre todos los campos y otro que solo muestre su subconjunto en el mismo modelo. Es la forma más simple sin mucha sobrecarga. Si insistes en que sea el mismo recurso, puedes seguir mi recomendación inicial sobre la sobrecarga get_list para incluir solo tu subconjunto de campos cuando los obtengas de ORM y los serialice. – astevanovic

+3

Debe haber 'del obj.data [field_name]'. – Mitar

18

También puede utilizar ahora el atributo use_in en un campo para especificar el recurso relevante para mostrar el campo. Esto puede ser o bien list o detail, o una devolución de llamada.

+2

Esa debería ser la respuesta principal. Mucho más obvio y claro que los métodos predominantes. – Radagast

+0

Este es uno de esos casos en los que debería poder cambiar la respuesta "Aprobado" para aquellos de nosotros que vengan más tarde a la fiesta. –

0

También se puede usar el método de deshidratación (self, bundle).

def dehydrate(self, bundle): del bundle.data['attr-to-del] return bundle

Cuestiones relacionadas