PATCH для поля многие ко многим в Django - PullRequest
2 голосов
/ 21 января 2020

У меня есть две модели, модель A и модель B, имеющие отношение многие ко многим. Я хочу запрос PATCH на / test / {id}, который указывает на TestView для обновления как modelA, так и modelB. Не удается найти подходящий способ сделать это.

models.py

class modelA(models.Model):
    field1 = models.CharField(max_length=100)
    field2 = models.CharField(max_length=100)


class modelB(models.Model):
    field3 = models.CharField(max_length=100)
    field4 = models.ManyToManyField(modelA)

serializers.py

class modelAserializer(serializers.ModelSerializer):
    field1 = serializers.CharField()
    field2 = serializers.CharField()
    class Meta:
        model = modelA
        fields = ('field1', 'field2',)


class modelBserializer(serializers.ModelSerializer):
    field3 = serializers.CharField()
    field4 = modelAserializer(many=True, read_only=True)

    def update(self, instance, validated_data):
        # **trying to update the models here**
        return super().update(instance, validated_data)

    class Meta:
        model = modelB
        fields =  ('field3', 'field4',)

views.py

class TestView(Modelviewset):
    serializer_class = modelBserializer
    queryset = modelB.objects.all()

Это полезная нагрузка, с которой я пытаюсь получить патч.

{
    "field3": "check1",
    "field4": [
    {
        "field1": "check1",
        "field2": "check1"
    },
    {
        "field1": "check2",
        "field2": "check2"
    }
}

1 Ответ

2 голосов
/ 21 января 2020

ВЫ ДОЛЖНЫ ДОБАВИТЬ ID ПОЛЯ В СЕРИАЛИЗАТОРЕ MAN!

class modelAserializer(serializers.ModelSerializer):
    field1 = serializers.CharField()
    field2 = serializers.CharField()
    class Meta:
        model = modelA
        fields = ('field1', 'field2', 'id')

Также в моделиBserializer:

def update(self, instance, validated_data):
        instance.field3 = validated_data.get('field3', instance.field3)
        if validated_data.get('field4'):
            filed4 = validated_data.pop('field4')
            for item in filed4:
                other_inst = modelA.object.get(id=item.get('id'))
                other_inst.field1 = item.get('field1')
                other_inst.field2 = item.get('field2')
                other_inst.save()
        instance.save()
        return instance

После этого вы должны использовать

{
    "field3": "check1",
    "field4": [
    {
        "id": 1,
        "field1": "check1",
        "field2": "check1"
    },
    {
        "id": 2,
        "field1": "check2",
        "field2": "check2"
    }]
}
...