es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Relación de muchos a muchos entre 3 tablas en Django.

Tengo los siguientes modelos:

class Project(models.Model):
    project_name = models.CharField(max_length=50)
    project_users = models.ManyToManyField('Users.UserAccount', related_name='project_users', blank=True)
    ....

class UserAccount(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=30, unique=True)
    ....

class Discipline(models.Model):
    name = models.CharField(unique=True, max_length=27, choices=discipline_choices)

La tabla de la base de datos para project_users se ve así:

*--------*----------------*---------------------*
|   ID   |   project_id   |   user_account_id   |
*--------*----------------*---------------------*

Deseo tener una relación adicional en el campo/tabla project_users con el modelo Discipline. ¿Es esto posible en Django? He estado revisando las relaciones intermedias muchos a muchos en Django, pero eso no es exactamente lo que quiero. En mi aplicación, hay una cantidad fija de disciplinas, y lo que intento lograr es darle a cada usuario múltiples disciplinas en un solo proyecto. Algo así:

*--------*----------------*---------------------*-------------------*
|   ID   |   project_id   |   user_account_id   |   discipline_id   |
*--------*----------------*---------------------*-------------------*

¿Es esto posible?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible crear una relación adicional en el campo/tabla “project_users” con el modelo “Discipline” en Django. La solución es crear un nuevo modelo que actúe como puente entre los modelos “Project” y “Discipline”.

    Por ejemplo:

    class Project(models.Model):
        project_name = models.CharField(max_length=50)
        project_users = models.ManyToManyField('Users.UserAccount', related_name='project_users', blank=True)
        disciplines = models.ManyToManyField('Discipline', through='ProjectDiscipline')
    
    class ProjectDiscipline(models.Model):
        project = models.ForeignKey(Project, on_delete=models.CASCADE)
        discipline = models.ForeignKey(Discipline, on_delete=models.CASCADE)
        user = models.ForeignKey(UserAccount, on_delete=models.CASCADE)
    

    Esto crea una relación de muchos a muchos entre “Project” y “Discipline” a través del modelo “ProjectDiscipline”. El campo “user” se agrega para indicar qué usuario está asociado con una disciplina específica en un proyecto dado.

    Para crear una nueva relación entre un proyecto y una disciplina para un usuario específico, puedes hacer algo como:

    project = Project.objects.get(id=1)
    user = UserAccount.objects.get(id=1)
    discipline = Discipline.objects.get(id=1)
    
    ProjectDiscipline.objects.create(project=project, discipline=discipline, user=user)
    

    Esto creará una nueva entrada en la tabla “ProjectDiscipline” que vincula el proyecto, el usuario y la disciplina.

    Ten en cuenta que es posible que debas modificar tu código existente que funciona con el campo “project_users” para tener en cuenta este nuevo modelo “ProjectDiscipline”.

Comments are closed.