Django Rest Framework - foreign key update

I am a little disappointed with this problem using the Django Rest Framework:

I am using viewet , p custom serializer. This serializer has depth set to 1. When I request this view, I get the correct data view, for example:

data = {
  id: 1,
  issue_name: 'This is a problem',
  status: {
    id: 3,
    name: 'todo'
  }
}

Problem appears when I need to update the status . For example, if I want to select a different status for this problem, for example:

status_new = {
   id: 4,
   name: 'done'
}

I send the following PATCH back to the server, this is the output:

data = {
  id: 1,
  issue_name: 'This is a problem',
  status: {
    id: 4,
    name: 'done'
  }

}

However, the status is not updated. Infact, it is not even part of the validated_data dictionary. I read that nested relationships are read-only. Can someone please tell me that I need to do this in a simple way?

It would really be a must.

Thank you in advance

+9
3

, create() update() , .

depth, , validated_data.

EDIT: , : ModelIssueSerializer. PATCH/PUT . :

class StatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = Status

class ModelIssueSerializer(serializers.ModelSerializer):
    status = StatusSerializer()
    # ...
    def update(self, instance, validated_data):
        status = validated_data.pop('status')
        instance.status_id = status.id
        # ... plus any other fields you may want to update
        return instance

, , StatusSerializer validated_data. , depth, update()/create() ( ). StatusSerializer - depth=1

+7

, . , , " " (), , . SlugRelatedField.

from rest_framework import serializers


class StatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyStatusModel
        fields = (
            'id',
            'status',
        )


class IssueSerializer(serializers.ModelSerializer):
    status = serializers.SlugRelatedField(slug_field='status', queryset=MyStatusModel.objects.all())

    class Meta:
        model = MyIssueModel
        fields = (
            'issue_name',
            'status',
        )

ui-select select2 - RESTfull: Issue, Status . Angular , .

, .

0

.

class StatusField(serializers.Field):

    def to_representation(self, value):
        return StatusSerializer(value).data

    def to_internal_value(self, data):
        try:
            return Status.objects.filter(id=data['id']).first()
        except (AttributeError, KeyError):
            pass

:

class IssueSerializer(serializers.ModelSerializer):
    status = StatusField()

    class Meta:
        model = MyIssueModel
        fields = (
            'issue_name',
            'status',
        )
0

Source: https://habr.com/ru/post/1611254/


All Articles