I have a Store model and store's types models
class Store(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT)
name = models.CharField(max_length=128, blank=True, default="", verbose_name="name")
class AmazonStore(models.Model):
store = models.ForeignKey(Store, on_delete=models.CASCADE, null=True, verbose_name="Amazon store")
amazon_api_key = models.CharField(max_length=255, blank=True, default="", verbose_name="amazon token")
class AliStore(models.Model):
store = models.ForeignKey(Store, on_delete=models.CASCADE, null=True, verbose_name="Ali store")
ali_api_key = models.CharField(max_length=255, blank=True, default="", verbose_name="ali token")
I have a view (GenericViewSet, CreateModelMixin, ListModelMixin) to create and list stores and now I want to add an update method to update Store (and fields of its related model)
I want to be able to update store's name and store's api key in one update() method and one serializer. Depending on the type of store, different data may be sent in the request.data.
Examples: 1.
AmazonConnectOptions: {
name: 'New store name',
ApiKey: 'new api key'
}
AliConnectOptions: {
name: 'New store name',
ApiKey: 'new api key'
}
I want to use UpdateModelMixin and add an update() method:
def update(self, request, *args, **kwargs):
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)
return Response(status=200)
But I don't know how to update store and its keys in one serializer.
You can do serializer.save()
to save the updated data.
def update(self, request, *args, **kwargs):
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)
serializer.save()
return Response(status=200)
This will override the existing data with new data.
Reference: save()