Foros del Web » Programando para Internet » Python »

Restricciones sobre ManyToMany

Estas en el tema de Restricciones sobre ManyToMany en el foro de Python en Foros del Web. Hola! estoy aprendiendo django y me he topado con un pequeño problemita a la hora de crear relaciones muchos a muchos, y es que me ...
  #1 (permalink)  
Antiguo 13/04/2014, 17:13
Avatar de Kristhoff  
Fecha de Ingreso: abril-2009
Ubicación: Popayán - Cauca
Mensajes: 550
Antigüedad: 15 años
Puntos: 12
Información Restricciones sobre ManyToMany

Hola!
estoy aprendiendo django y me he topado con un pequeño problemita a la hora de crear relaciones muchos a muchos, y es que me permite crear varias instancias sobre la misma tabla de relación con los mismos datos, entonces, quisiera saber si es posible poner constraints para que solo se permita un único registro del par de id, y si es posible alguna restricción del tipo *..x (muchos a x valor).
El modelo que sigo es el siguiente (El de la documentación oficial de django)
Código Python:
Ver original
  1. class Persona(models.Model):
  2.     id = models.AutoField(primary_key=True)
  3.     nombre = models.CharField(max_length=50, verbose_name='Nombre')
  4.     def __str__(self):
  5.         return self.nombre
  6.  
  7. class Grupo(models.Model):
  8.     id = models.AutoField(primary_key=True)
  9.     nombre = models.CharField(max_length=50, verbose_name='Nombre')
  10.     miembros = models.ManyToManyField('Persona', through='Membresia')
  11.     def __str__(self):
  12.         return self.nombre
  13.  
  14. class Membresia(models.Model):
  15.     persona = models.ForeignKey('Persona')
  16.     grupo = models.ForeignKey('Grupo')
  17.     fechaIngreso = models.DateField(verbose_name='Fecha de ingreso')
Datos en el modelo Persona:

Datos en el modelo Grupo:

Al registrar las mismas instancias en el modelo membreía, django me lo permite:

Lo que se haría normalmente es agregar a la tabla un constraint donde persona_id y grupo_id sean la llave primaria, pero en django no se permiten llaves compuestas.
__________________
"I need metal in my life, just like an eagle needs to fly..."
  #2 (permalink)  
Antiguo 13/04/2014, 17:36
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Restricciones sobre ManyToMany

Cuando usas `through` no te crea ese indice único compuesto como lo haría si no usaras `through`. Tienes que crearlo tu mismo.

Código Python:
Ver original
  1. class Membresia(models.Model):
  2.     persona = models.ForeignKey('Persona')
  3.     grupo = models.ForeignKey('Grupo')
  4.     fechaIngreso = models.DateField(verbose_name='Fecha de ingreso')
  5.  
  6.     class Meta:
  7.         unique_together = ('persona', 'grupo')
  #3 (permalink)  
Antiguo 13/04/2014, 18:11
Avatar de Kristhoff  
Fecha de Ingreso: abril-2009
Ubicación: Popayán - Cauca
Mensajes: 550
Antigüedad: 15 años
Puntos: 12
Respuesta: Restricciones sobre ManyToMany

Cita:
Iniciado por razpeitia Ver Mensaje
Cuando usas `through` no te crea ese indice único compuesto como lo haría si no usaras `through`. Tienes que crearlo tu mismo.

Código Python:
Ver original
  1. class Membresia(models.Model):
  2.     persona = models.ForeignKey('Persona')
  3.     grupo = models.ForeignKey('Grupo')
  4.     fechaIngreso = models.DateField(verbose_name='Fecha de ingreso')
  5.  
  6.     class Meta:
  7.         unique_together = ('persona', 'grupo')
^_^ funciona perfecto, gracias!!
__________________
"I need metal in my life, just like an eagle needs to fly..."

Etiquetas: constraint, django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:25.