Triggers con Django en el modelo de datos

  • por javier
  • 22 de Marzo de 2023

Triggers con Django en el modelo de datos

Me imagino que estareis disfrutando de unas merecidas vacaciones, no obstante, quiero ofreceros un nuevo artículo sobre Django. Noo no es un quick n dirty, jeje Se trata de un ejemplo de como implementar triggers en Django y su ORM. Para la realización de ésta tarea, tenemos varias opciones:

  1. Implementar directamente en nuestra view.py el trigger, lo cual es aceptable pero no muy elegante en términos de MVC.
  2. Implementar en el models.py nuestro trigger. Es el caso que vamos a revisar, ya que es el más cómodo de implementar y respeta de cierta manera el modelo de tres capas de Django.
  3. Crear independientemente del ORM de Django nuestro trigger, centrandonos en la base de datos que utilicemos. Esta solución no es muy cómoda, ya que si cambiamos por lo que sea de base de datos o de diseño de nuestro model, tendremos que implementar esos cambios en la base de datos elegida.

En términos de rendimiento, es obvio que el trigger nativo será más rápido, seguido de cerca por las dos primeras opciones, cuyo rendimiento debería ser equivalente en ambos casos. Pasando a nuestro ejemplo, vamos a partir de 2 tablas. Cuando actualicemos una, se actualizará la otra automáticamente, tras redefinir el método save() de nuestra tabla.

Así pues, el código sería el siguiente:

	################################
	#   models.py
	##########################################
	
	from django.db import models

	class Jugadores(models.model):
	     nombre=models.CharField(max_length=45)  # 45 caracteres para definicion del nombre en Jugadores

	class Ranking(models.model):
	     jugador=models.ForeignKey(Jugadores)	# Clave que enlaza con Jugadores
	     puntos=models.IntegerField(default=0)	# entero con total de puntos y 0 por defecto. 
							# Al ordenar Ranking por puntos, tendremos el ranking de jugadores

	class Partidas(models.model):
		jugador=models.ForeignKey(Jugadores)	# Clave que enlaza con Jugadores
		puntos=models.IntegerField(default=0)	# puntos por partida
		def save(self, *args, **kwargs):		# redefinicion del metodo save() que contiene nuestro trigger
			 # Aqui ponemos el codigo del trigger -------
		 	rank=Ranking.objects.get(jugador=self.jugador)	
		 	rank.puntos+=self.puntos
		 	rank.save()
		 	# fin de trigger ------	
		 	return super(Partidas, self).save( *args, **kwargs)  # llamada al save() original con sus parámetros correspondientes

	####################
	# llamada en views.py	
	#####################
	
	def anotaPuntos(request, idjugador, puntos):
	    jugador=Jugadores.objects.get(id=idjugador)			# obtencion del jugador por id de jugador
	    partida=Partidas.objects.create(jugador=jugador, puntos=puntos)	# creacion de partida
	    partida.save()							# al salvar, se llama a nuestro trigger. Otra aproximación sería 
	    return HttpResponse("ok")						# crear directamente un método independiente con el trigger en 											
                                                                                              # Partidas


La explicación del código es trivial si sabeis algo de Django. Inicialmente, definimos 3 tablas. Una con los nombres de jugadores, otra que nos permitirá, en consultas, ordenando por puntos, obtener de forma rápida el ranking de jugadores (Ranking) y otra, Partidas. Esta última tabla la manejaremos con mayor asiduidad y contendrá el código de nuestro trigger, mediante la redefinición del método save(). Se parte de la suposición de que la tabla de Jugadores está creada y rellenada, así como la tabla Ranking. El código de anotaPuntos, se imagina que captura mediante un get los parámetros idjugador y puntos, seguidamente, obtiene el objeto del jugador correspondiente, para crear posteriormente una nueva partida terminada, que se actualizará mediante save(). Finalmente, se responde con un ok incondicionalmente.

Hasta aquí, nuestro artículo sobre triggers. Probad el código y experimentad con él. Como siempre, una duda, un comentario.

Saludos y
happy coding!!!
fuente: Stack Overflow

blog comments powered by Disqus

Introducción a metodologías ágiles de desarrollo. Programación Extrema. (XP)

  • por javier
  • 21 de Marzo de 2023

La programación extrema (XP) es una metodología de desarrollo, si puede ser considerada como tal, pues se caracteriza por ser un conjunto de prácticas y no está considerada como metodología por una extensa mayoría de ingenieros del software.eXtreme Programming

No obstante, es de extendido uso en proyectos software y sus prácticas han sido de amplia aceptación en muchos casos, sobre todo proyectos pequeños o medianos debido a su curva de aprendizaje suave, a producir código de calidad, completamente funcional, sin fallos ni sorpresas para el cliente, que, siempre percibirá un producto final adecuado a sus necesidades, no a lo que creen los analistas o desarrolladores que necesita el cliente.

Uso del ORM de Django en tus programas CUI/GUI

  • por javier
  • 21 de Marzo de 2023

Señores, SQL, en mi opinión, ha muerto. O a lo sumo, queda como capa subyacente de los muchos sistemas de Mapeo Objeto-Relacionales. Es obvio que el modelado de la base de datos, desde el punto de vista de Análisis, sigue siendo similar, pero desde el punto de vista del desarrollador, --de un tiempo a esta parte--, nos encontramos con que todos los Frameworks que se precien y utilicen Sistemas Gestores de Bases de Datos Relacionales o Híbridos incluso, en la capa Modelo, (Ver modelo de 3 capas), utilizan ORM (Mapeo Objeto-Relacional) como nuevo interfaz dentro del lenguaje de programación y/o Framework elegido.

Detecta dispositivos USB no autorizados en Linux (Extensible Python Snippet)

  • por javier
  • 21 de Marzo de 2023

La proliferación de dispositivos USB maliciosos, para hacerse con el control de nuestra máquina están a la orden del día.

Los hay muy variados y de diferente funcionalidad, y permiten un amplio rango de posibilidades a la hora de hackear nuestra máquina.

Contra esto, hay varias soluciones, como USBGuard, que no funciona bien en distros estables por problema de dependencias.

También hay otras soluciones como USB Canary que permite twittear y enviar sms con Twilio para avisarnos de dichos ataques.

No obstante, me he permitido el lujo de crear un snippet algo más abierto y sencillo para que modifiqueis a vuestro antojo y en base a vuestras necesidades.

Se me ocurre integrarlo con OSSEC, por ejemplo, con una regla e incorporarlo vuestro sistema de alertas..

Update cookies preferences