Django Rest framework Сериализировать многие на многие поля - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь сериализовать полезную нагрузку json, у которой есть поле с массивом, проверка .is_valid() возвращает true, но я получаю KeyError: 'passengers', когда пытаюсь сделать это serializer.data['passengers'], но другие поля работают нормально ( например, номер_ бронирования и статус).

Это response.data, который я передаю seralizer:

{'booking_number': 2839, 'passengers': [{'first_name': 'Jack', 'surname': 'Smith', 'email': 'smith@mail.com', 'phone_number': '1234'}], 'status': 'ON_HOLD'} 

Мои сепараторы:

class PassengerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Passenger



class FindBus(serializers.ModelSerializer):
    passengers = PassengerSerializer(read_only=True, many=True)

    class Meta:
        model = Booking
        fields = ('booking_number', 'passengers', 'status')

Мои модели:

class Passenger(models.Model):
    first_name = models.CharField(max_length=25)                                    
    surname = models.CharField(max_length=25)                                       
    email = models.EmailField()                                                     
    phone_number = models.CharField(max_length=12) 


class Booking(models.Model):
    booking_number = models.IntegerField(unique=True)                                                                                           
    passenger = models.ManyToManyField(Passenger)                                   
    status = models.CharField(max_length=10)                                        
    hold_time = models.DateTimeField()  

Буду очень признателен за любые советы о том, как заставить это работать.

Кстати, я следовал за этим: Django rest framework, сериализующий многие ко многим полям

1 Ответ

0 голосов
/ 04 мая 2018

Если вам нужно десериализовать поля, вы не должны использовать read_only=True:

class FindBus(serializers.ModelSerializer):
    passengers = PassengerSerializer(many=True)
    ...

Обратите внимание, что этого будет недостаточно для сохранения отношений m2m: как объяснено в Вложенные записываемые сериализаторы , вам также необходимо определить методы create() и / или update() на вашем сериализаторе:

class FindBus(serializers.ModelSerializer):
    passengers = PassengerSerializer(many=True)
    ...

    def create(self, validated_data):
        ...

    def update(self, validated_data):
        ...

Причина необходимости create / update заключается в том, что вы должны решить, относятся ли полученные вами сведения о пассажире к существующим объектам или их необходимо создать.

Возможно, вам также понадобится добавить fields = ('__all__',) (или указать интересующие вас поля) к вашему PassengerSerializer:

class PassengerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Passenger
        fields = ('__all__',)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...