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:
- Open Answer UpdateView from user1
- Open Answer UpdateView from user2
- Save UpdateView from user1
- 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