I’m sending an object like this to my Django backend to update the.
{
id: 1,
firstName: 'Foo',
lastName: 'Bar',
items: [
{
id:1,
cost: 150,
....
calculatedValue: 0
},
{
id: 2,
cost: 100,
....
calculatedValue: 0
}
]
}
Here are the Models
class Parent(models.Model):
firstName = models.models.TextField()
lastName = models.TextField()
class Item(models.Model):
parent = models.ForeignKey(Parent, related_name='items', on_delete=models.CASCADE)
cost = models.FloatField(blank=True, default=0, null=True)
calculatedValue = models.FloatField(blank=True, default=0, null=True)
Here are the serializer
class ParentSerializer(serializers.ModelSerializer):
items = ItemSerializer(many=True, read_only=True)
class Meta:
model = Parent
fields = ('id', 'firstName', 'lastName')
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ('id', 'cost', 'calculatedValue')
My intention is perform the operation for the calculatedValue
on the server during the post or put calls. The issue I’m running into is the value I’m computing isn’t saving to the database.
def update(self, request, *args, **kwargs):
# I set the values on the request.data object here
setValues(request.data)
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
#save transaction
items = request.data['items']
for item in items:
itemInstance = Item.objects.get(id=item['id'])
itemSerializer = ItemSerializer(itemInstance, data=transaction, partial=False)
itemSerializer.is_valid(raise_exception=True)
itemSerializer.save()
#the correct value prints here
print(f'instance after save {itemSerializer.data}')
return Response(serializer.data)
Even though the itemSerializer.data
shows the values have been saved, when I do a get on the parent object, the changes aren’t there.
How do I get these values to save?