Сериализатор Django REST Framework PrimaryKeyRelatedField () не добавляет объект в ответ GET - PullRequest
0 голосов
/ 01 октября 2018

Я использую Django 2.x и `Django REST Framework.

У меня есть models.py с содержимым в виде

class ModeOfPayment(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField()

class AmountGiven(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    contact = models.ForeignKey(Contact, on_delete=models.PROTECT)
    amount = models.FloatField()
    mode_of_payment = models.ForeignKey(
        ModeOfPayment,
        on_delete=models.PROTECT,
        blank=True,
        default=None,
        null=True
    )

и сериализаторов.py

class AmountGivenSerializer(serializers.ModelSerializer):
    mode_of_payment = serializers.PrimaryKeyRelatedField(queryset=ModeOfPayment.objects.all())

    class Meta:
        model = AmountGiven
        depth = 1
        fields = (
            'id', 'contact', 'amount', 'mode_of_payment', 
        )

    def update(self, instance, validated_data):
        mode_of_payment = validated_data.pop('mode_of_payment')
        instance.mode_of_payment_id = mode_of_payment.id
        return instance

Это прекрасно работает, так как я могу обновить поле mode_of_payment.Но в ответ при вызове amount_given не содержит параметров mode_of_payment объекта.

ответ похож на

{
    "id": "326218dc-66ab-4c01-95dc-ce85f226012d",
    "contact": {
        "id": "b1b87766-86c5-4029-aa7f-887f436d6a6e",
        "first_name": "Prince",
        "last_name": "Raj",
        "user": 3
    },
    "amount": 3000,
    "mode_of_payment": "0cd51796-a423-4b75-a0b5-80c03f7b1e65",
}

при удалении строки

mode_of_payment = serializers.PrimaryKeyRelatedField(queryset=ModeOfPayment.objects.all())

добавляет mode_of_payment параметры с ответом, но на этот раз это не обновляет поле mode_of_payment в amount_given.

, почему данные mode_of_payment не содержатся, даже если для depth установлено значение 1.

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете создать ModeOfPaymentSerializer и использовать его в методе to_representation() AmountGivenSerializer:

class ModeOfPaymentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModeOfPayment
        fields = (
            'id', 'title',
        )

class AmountGivenSerializer(serializers.ModelSerializer):
    mode_of_payment = serializers.PrimaryKeyRelatedField(queryset=ModeOfPayment.objects.all())

    class Meta:
        model = AmountGiven
        fields = (
            'id', 'contact', 'amount', 'mode_of_payment', 
        )

    def update(self, instance, validated_data):
        mode_of_payment = validated_data.pop('mode_of_payment')
        instance.mode_of_payment_id = mode_of_payment.id
        return instance

    def to_representation(self, value):
        data = super().to_representation(value)  
        mode_serializer = ModeOfPaymentSerializer(value.mode_of_payment)
        data['mode_of_payment'] = mode_serializer.data
        return data
...