# return error if the follow is already done
current_follow_query = request.user.follows.filter(influencer=influencer)
if current_follow_query.count() > 0:
error = {'detail': 'Ya eres follower de este influencer'}
return Response(data=error, status=status.HTTP_403_FORBIDDEN)
# save the actual follow object
obj = Follow(follower=request.user, influencer=influencer)
obj.save()
Todo esto parecía funcionar bien, hasta que encontré follows duplicados en la base de datos. Es decir, un usuario siguiendo a otro más de una vez, lo cuál es un error.
La única manera que se me ocurre para que esto pueda pasar es que entre el condicional que veis (if current_follow_query.count() > 0:) y el bloque de texto que guarda el objeto, se procese esta misma llamada paralelamente.
¿Sabéis como puedo bloquear la tabla "Follow" para que todo este código corra del tirón antes de procesar otra llamada?
Saludos
--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
obj. created = Follow.object.update_or_create(follower=request.user, , influencer=influencer)
if created:return Response(data="Ahora estas siguiendo a {}".format(influencer))else:
error = {'detail': 'Ya eres follower de este influencer'}
return Response(data=error, status=status.HTTP_403_FORBIDDEN)
Yo tengo un sistema de facturacion de vozip, mayormente creado en django que se llama DataBilling.co, cuando ingresaban muchas llamadas concurrentes
el ORM o el SQL directo en python, en ocaciones sobre-escribien descuentos de saldos, por ejemplo si tenia tres llamadas y las tres terminaban al mismo tiempo
solo me descontaba una llamada, y las otras dos dos solo quedaban en el registro, la unicasolucion facil y que hasta el momento me ha funcionado perfectamente fue
un tigger en la base de datos, que es lo suficiente rapido y controlado para algo que ocurre casi al mismo tiempo o al mismo tiempo.
try: obj = Person.objects.get(first_name='John', last_name='Lennon') for key, value in updated_values.iteritems(): setattr(obj, key, value) obj.save() except Person.DoesNotExist: updated_values.update({'first_name': 'John', 'last_name': 'Lennon'}) obj = Person(**updated_values) obj.save()
try:
Follow.objects.create(follower=request.user, influencer=influencer)
except IntegrityError:
# the object already exists
error = {'detail': 'Ya eres follower de este influencer'}
return Response(data=error, status=status.HTTP_403_FORBIDDEN)
else:
return Response(status=status.HTTP_204_NO_CONTENT)