2015-07-23 2 views
1

Привет я хочу, чтобы обеспечить только пару значений без ключей на REST службы:Джанго Rest Framework настраиваемое поле только пара значений (без имя_поля как ключ Dict)

взгляните на мой serializers.py:

class TranslationSerializer(serializers.ModelSerializer): 
     translated_term = serializers.CharField(read_only=True) 

     class Meta: 
       model = Translation 
       fields = ('language','translated_term') 

class VocabSerializer(serializers.ModelSerializer): 
     ... 
     translates = TranslationSerializer(many=True, read_only=True) 
     ... 

     class Meta: 
     model = Vocab 
     fields = (..., 'translates',...) 

в результате получается следующее:

"translates": [ 
     { 
      "language": "EN", 
      "translated_term": "Chair" 
     } 
     { 
      "language": "IT", 
      "translated_term": "asd" 
     } 
    ], 

, как вы можете видеть, этот результат показывает имя поля в качестве ключа Dict рядом с Валу ue этого поля. , но я хотел бы иметь другую структуру. Как следующее:

"translates": [ 
     { 
      "EN": "Chair", "IT":"asd" 
     } 
    ], 

этот пример показывает пару ключ/значение, где ключ является значение поля языка и значение Dict это значение переведенной области.

Как я могу показать только пару значений поля 'language' с полем 'transl' без имени поля?

ответ

1

С помощью создания пользовательской функции to_representation для сериализатора вы можете управлять своим представлением в словаре.

class TranslationSerializer(serializers.ModelSerializer): 
     translated_term = serializers.CharField(read_only=True) 

     def to_representation(self, instance): 
      # get the instance -> Dict of primitive data types 
      representation = super(TranslationSerializer, self).to_representation(instance) 

      # manipulate returned dictionary as desired 
      language = representation.pop('language') 
      translated_term = representation.pop('translated_term') 

      # repackage 
      repackaged = {language: translated_term} 

      return repackaged 

     class Meta: 
       model = Translation 
       fields = ('language','translated_term') 

Это будет генерировать JSON в формате

"translates": [ 
     { 
      "EN": "Chair" 
     }, 
      "IT": "asd" 
     } 
    ], 

Однако, это не совсем, как вы хотите, чтобы это выглядело, возможно, обычай «to_representation» для VocabSerializer может преформ это.

6

Вы можете осуществить это путем настройки list serializer:

class TranslationListSerializer(serializers.ListSerializer): 
    def to_representation(self, data): 
     r = super().to_representation(data) 

     return { item['language']: item['translated_term'] for item in r } 

class TranslationSerializer(serializers.ModelSerializer): 
    translated_term = serializers.CharField(read_only=True) 

    class Meta: 
      model = Translation 
      fields = ('language','translated_term') 
      list_serializer_class = TranslationListSerializer 

 Смежные вопросы

  • Нет связанных вопросов^_^