def update(self, instance, validated_data): """ Update the resources associated with an aquifer, inline of the aquifer API. """ resources_data = validated_data.pop('resources', []) for k, v in validated_data.items(): setattr(instance, k, v) instance.save() # Any items removed from the inline collection are deleted. to_delete = models.AquiferResource.objects.filter( aquifer=instance).exclude( id__in=[r['id'] for r in resources_data if 'id' in r]) to_delete.delete() for resource_item in resources_data: if 'instance' in resource_item: resource = resource_item['instance'] resource.section = resource_item['section']['code'] resource.name = resource_item['name'] resource.url = resource_item['url'] resource.save() else: r = models.AquiferResource( url=resource_item['url'], name=resource_item['name'], aquifer=instance, section_id=resource_item['section']['code'].code) r.save() return instance
def create(self, validated_data): """ Allow creating resources inline of the aquifer API. ie) { resources: [{ url: 'http://...', name: 'A resource', section_id: 1 }, { ... }, ...] ... } """ resources_data = validated_data.pop('resources', []) aquifer = models.Aquifer.objects.create(**validated_data) for resource_item in resources_data: r = models.AquiferResource( url=resource_item['url'], name=resource_item['name'], aquifer=aquifer, section_id=resource_item['section']['code'].code) r.save() return aquifer