Django REST Framework обновляет поле внешнего ключа на PUT - PullRequest
0 голосов
/ 30 сентября 2018

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

My 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
    )

и serializers.py

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


class AmountGivenSerializer(serializers.ModelSerializer):
    mode_of_payment = ModeOfPaymentSerializer()

    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

и views.py

class AmountGivenViewSet(viewsets.ModelViewSet):
    serializer_class = AmountGivenSerializer
    permission_classes = (IsAuthenticated, AdminAuthenticationPermission,)
    filter_fields = ('contact__id',)

    def get_queryset(self):
        queryset = AmountGiven.objects.filter(
            contact__user=self.request.user
        )

        return queryset

Но когда я публикую данные, используя postman с PUT , чтобы обновитьсуществующая запись

enter image description here

В ней все еще говорится

{
    "mode_of_payment": [
        "This field is required."
    ]
}

Редактировать 2: Ответ после ответа Даниила

{
    "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",
}

1 Ответ

0 голосов
/ 30 сентября 2018

Вы сказали AmountSerializer принять вложенный dict, представляющий экземпляр ModeOfPayment, установив для поля mode_of_payment значение ModeOfPaymentSerializer.Но это не то, что вы отправляете;вы отправляете идентификатор ModeOfPayment.

Вы должны удалить эту строку в AmountGivenSerializer.

Редактировать

Я ошибся, вам нужно явно объявить полекак PrimaryKeyRelatedField:

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

    class Meta:
        ...

Теперь он будет принимать UUID в данных.

...