Изменить ключ поля ModelSerializer с помощью функции

У меня есть простой Django Rest Framework ModelSerializer для модели с полем «имя». Я хочу сериализовать его, чтобы имя было значением, а его очищенное имя было ключом следующим образом:

"results": [
    {
        "mymodel1" : "My Model 1"
    },
    {
        "mymodel2" : "My Model 2"
    }]

В настоящее время у меня есть:

class ModelSimpleSerializer(serializers.ModelSerializer):

  keyname = serializers.SerializerMethodField('get_model_keyname')
  class Meta:
    model = myModel
    fields = (
      'keyname',
    )
  def get_model_keyname(self,obj):
    keyname = obj.name
    keyname = keyname .lower()
    keyname = keyname .replace(" ", "")
    return keyname

который возвращает:

"results": [
    {
        "keyname" : "mymodel1"
    },
    {
        "keyname" : "mymodel2"
    }]

Любые идеи?

Благодарю вас!


person Domen Preložnik    schedule 25.07.2019    source источник
comment
Вам это помогает? stackoverflow.com/questions/43157028/   -  person RaideR    schedule 25.07.2019
comment


Ответы (2)


Попробуй это

class ModelSimpleSerializer(serializers.Serializer):
    def to_representation(self, obj):
        keyname = obj.name.lower().replace(" ", "")
        return {
            keyname: obj.name,
        }

Обратите внимание, что это будет сериализатор только для чтения. Но он будет соответствовать вашим требованиям

objects = myModel.objects.all()

ModelSimpleSerializer(objects.first()).data
# {"mymodel1" : "My Model 1"}

ModelSimpleSerializer(objects, many=True).data
# [{"mymodel1" : "My Model 1"}, {"mymodel2" : "My Model 2"}]
person Aneesh R S    schedule 25.07.2019

можешь попробовать это

class ModelSimpleSerializer(serializers.ModelSerializer):

      name = serializers.SerializerMethodField()
      class Meta:
        model = myModel
        fields = (
          'name',
        )
      def get_name(self,obj):
        keyname = obj.name
        keyname = keyname .lower()
        keyname = keyname .replace(" ", "")
        return keyname
person Gaurav Ravindra Bole    schedule 25.07.2019
comment
Это возвращает: результаты: [ {имя: mymodel1}, {имя: mymodel2}] - person Domen Preložnik; 25.07.2019
comment
Я думаю, вы хотите, чтобы значение было ключом, а ключ - значением. Я прав? - person Gaurav Ravindra Bole; 25.07.2019
comment
Я хочу очистить имя в качестве ключа и обычное имя в качестве значения. результаты: [{mymodel1 : Моя модель 1}{mymodel2 : Моя модель 2}] - person Domen Preložnik; 25.07.2019