DRF — переопределение сериализатора.обновление для обновления связанного набора

#python #django #serialization #django-rest-framework

#python #django #сериализация #django-rest-framework

Вопрос:

Я пытаюсь переопределить update метод ModelSerializer , чтобы я мог обновлять связанный набор объектов при обновлении экземпляра.

Проблема в том, что validated_data не включает ids эти объекты, даже когда я передаю их сериализатору.

 def update(self, instance, validated_data):
    subcontracts = validated_data.pop('subcontracts') # THERE ARE NO IDS HERE
    contract = super().update(instance,validated_data)
    instance.subcontracts.exclude(id__in=[x.get('id',None) for x in subcontracts if x is not None]).delete()
    for subcontract in subcontracts:
        _id = subcontract.get('id',None)
        if _id:
            sc = SubContract.objects.get(id=_id)
        else:
            sc = SubContract()
        for attr, value in subcontract.items():
            setattr(sc, attr, value)
            sc.contract = instance
        sc.save()


    return contract
 

В принципе, то, что я хочу сделать:

 {id:4, some_data..., subcontracts:[{id:1,description:'xxx'},{id:2,description:'yyy'}]}
 

Эти данные (за исключением обновления экземпляра) удалят связанные subcontracts , не имеющие идентификатора 1 или 2, и обновят остальные.

Вы знаете, что делать?

Комментарии:

1. Без определения сериализатора и полезной нагрузки, которая вызывает проблему, трудно сказать.

2. Не могли бы вы опубликовать полный класс сериализатора с помощью мета-класса? Кроме того, каков тип subcontracts поля в вашем сериализаторе? Это другой экземпляр сериализатора или что-то еще?