2015-07-09 3 views
0

Есть ли способ глобально исключить или включить некоторые поля из всех моделей.Django REST | В глобальном масштабе исключить некоторые поля в serializer

У меня есть поля, такие как «active», «created_time», «updated_time», «created_by», «updated_by» для всех моделей, они делают дополнительную нагрузку на ответ, если это не указано в exclude.

есть способ, чтобы исключить их в глобальном масштабе, если не указано в полях

+0

Только рекомендация: укажите поля, которые вы хотите включить в 'Meta.fields', на ваш сериализатор, это позволяет избежать таких проблем. –

ответ

0

Это не самое чистое решение, но это, как я делаю это с наследованием и конкретной ссылкой на Meta класс родительского Serializer в:

class SampleSerializer(serializers.HyperlinkedModelSerializer): 
    notes = MarkdownNoteSerializer(many=True,required=False,allow_add_remove=True) 
    class Meta: 
     model = Sample 
     fields = ('url', 'creation_datetime', 'update_datetime','notes') 

class RipeSampleSerializer(SampleSerializer): 
    class Meta: 
     model = RipeSample 
     fields = SampleSerializer.Meta.fields + ('ripe',) 

Затем вы можете включать или исключать поля, явно ссылаясь или не ссылаясь на поля.

Там также нет причин, почему вы не можете создавать наборы кортежей включить в полях:

SampleFields = ('foo', 'bar', 'baz') 
OtherFields = ('update', 'creation') 

[...] 
fields = SampleFields + OtherFields + ('yahoo',) 
0

Создать подмешать переназначающее get_fields метод:

class CustomFieldsMixin(object): 
    def _get_exlude_fields(self): 
     return ["active", "created_time", "updated_time", "created_by", "updated_by"] 

    def _get_include_fields(self): 
     return {"name": serializers.CharField()} 

    def get_fields(self): 
     fields = super(CustomFieldsMixin, self).get_fields() 

     for exclude_field in self._get_exclude_fields(): 
      if exclude_field in fields: 
       del field[fields] 

     for include_field, include_field_value in self._get_include_fields().items(): 
      if include_field not in fields: 
       field[include_field] = include_field_value 

     return fields 

(Это код просто пример базовой идеи)

И используйте миксин, если каждый сериализатор:

class SampleSerializer(CustomFieldsMixin, serializers.HyperlinkedModelSerializer)