Pick object from Cache UpdateView - Optimistic locking

Hi,

I am trying to implement optimistic locking for UpdateView. I have added version attribute in model and have created a presave signal:

@receiver(pre_save,sender=Answer)
def optimistic_locking(sender,instance,**kwargs):
	is_created=sender.objects.filter(pk=instance.pk).count()==0
	print('Pre save signal')
	print(is_created)
	if not is_created:
		row_count=sender.objects.filter(pk=instance.pk,
									version=instance.version).count()
		print(row_count,instance.version,sender.objects.filter(pk=instance.pk).first().version)
		if row_count != 1:
			raise OptimisticLockingException
		else:
			instance.version=instance.version+1

Now I have UpdateView and I test the following scenario:

  1. Open Answer UpdateView from user1
  2. Open Answer UpdateView from user2
  3. Save UpdateView from user1
  4. Save UpdateView from user2

When I save UpdateView from user2, form_valid method picks up object from db and hence the version of the saved object in step 3 is present in the instance. Hence the pre_save signal handler does not give error.

I have also tried overriding get_object in UpdateView form:

    def get_object(self,queryset=None):
		obj=getattr(self,'object',None)
		if not obj:
			if queryset is None:
				queryset = self.get_queryset()
			pk = self.kwargs.get(self.pk_url_kwarg, None)
			if pk is not None:
				queryset = queryset.filter(pk=pk)
			try:
			    # Get the single item from the filtered queryset
				print(self)
				obj = queryset.get()
				print('Picking cached object')
				print(obj.version)
			except ObjectDoesNotExist:
				raise Http404(_("No %(verbose_name)s found matching the query") %
		                  {'verbose_name': queryset.model._meta.verbose_name})
		return obj

So for clarity, you’re looking to ensure that someone saving to the database is starting from the same data as existed at the time the form was presented to them?

The djangopackages.org site has a list of pre-built packages for concurrency management that might be worth looking into.

Ken