I have following models :
ModelA
–> with fields flda1
, flda2
, fld3
and id
ModelB
–> with fields fldb1
, fldb2
, id
and a_obj = foreign-key-to-ModelA
Now I have to write view to update flda1
and flda2
of ModelA
and fldb1
of ModelB
resources having foreign-key-to-same(ModelA)
[some (not all) — i.e., not all b_objs
need to be modified ]
The update data must be sent as follows :
data = {
'flda1' : 'PRADEEP 2 title CHANGED',
'flda2' : 'medium CHANGED again...',
"b_objs" : [
{'fldb1':'TB', 'modela':99, 'id':184},
{'fldb1':'STF', 'modela':99, 'id':185}
]
}
And the query parameter contains id
for ModelA
The problem is that the view and the serializer are working properly for flda1
and flda2
. But when I add b_objs
, I get errors.
Here is my view :
class ViewA(RetrieveUpdateDestroyAPIView):
queryset = ModelA.objects.all().prefetch_related('b_objs')
serializer_class = ModelASerializer
def update(self, request, *args, **kwargs):
modela_id = = request.query_params['id']
modela_ins = queryset.filter(pk=modela_id).first()
serializer = self.get_serializer(project, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
And serializers are :
class ModelBSerializer(serializers.ModelSerializer):
class Meta :
model = ModelB
fields = '__all__'
class ModelASerializer(serializers.ModelSerializer):
obj_bs = ModelBSerializer(many=True)
def validate(self, data) :
# validation code
return data
def update(self, instance, validated_data):
print(validated_data)
for field, value in validated_data.items():
setattr(instance, field, value)
instance.save() # this saves ModelA fields
return instance
The problem is that validated_data
in update
does not show id
in b_objs
that is sent in data
So I am not able to filter ModelB resources from database and make changes to them
How to do