Как сделать пользовательский ответ в djangorestframework - PullRequest
1 голос
/ 02 марта 2020

Так что мне нравится идея использования представлений на основе классов и ModelSerializer, но у меня есть проблема с этим для моего конкретного случая использования. Может быть, я не использую его, так как он предназначен для использования.

class CarSerializer(serializers.ModelSerializer):

   class Meta:
        model = CarModel
        fields = ['car_name']


# A car can have build for multiple years
class MakelHistorySerializer(serializers.ModelSerializer):
   car = CarSerializer(many=True, read_only=True)

   class Meta:
        model = MakeHistoryModel
        fields = ['model_year', 'car']

Ответ таков:

{
  "car": {
           "car_name": "Fiesta"
   },
   "model_year": "2020"
}

Мои два класса моделей, CarModel и MakeHistoryModel, имеют ["id", " car_name "," factory "] и поля [" id "," car_id "," model_year "," country_id "] соответственно.

Какой ответ мне действительно нужен:

{
  "car_name": "Fiesta",
  "model_year": "2020"
}

Как бы я это сделал?

1 Ответ

2 голосов
/ 02 марта 2020

Вам не нужен первый сериализатор (CarSerializer). Просто этот сериализатор, у которого SerializerMethodField достаточно для вашего вывода:

class MakelHistorySerializer(serializers.ModelSerializer):
   car_name = serializers.SerializerMethodField()

   class Meta:
        model = MakeHistoryModel
        fields = ['model_year', 'car_name']

   def get_car_name(self,obj):
       return obj.car.name if obj.car_id else ''
       # I don't know your model so to avoid NoneType error, I added this check
...