0

I'm currently trying to setup some database models in djangos ORM. however im unable to figure out how i'm supposed to reference another models many-to-many- field.

Project model

class Project(models.Model):
    projectName = models.CharField(max_length=200)
    users = models.ManyToManyField(get_user_model())
    projectOwner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='projectowner', default=1)

The users = models.manytomanyfield(get_user_mode()) works fine and generates the correct relation in the database. now i want to add a new model that adds a many to many relation between rights and project_user so what the end result tables are supposed to look like:

project:
projectname - string
projectowner - id of referenced user

user: django orm auth user model

rights:
name
description
etc

project_user:
id
project_id
user_id

rights_projectuser:
id
rights_id
project_user_id

now that last one (rights_projectuser) is what i dont know how to make.

2 Answers2

1

You need to turn "project_user" into a through model that you can then add the many to many relationship to.

class Project(models.Model):
    projectName = models.CharField(max_length=200)
    users = models.ManyToManyField(get_user_model(), through='ProjectUser')

class ProjectUser(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    rights = models.ManyToManyField(Right)
Iain Shelvington
  • 31,030
  • 3
  • 31
  • 50
  • if i were to run that code dont i end up with 2 many-to-many relations between project and user? 1 from model projects :users = models.manytomany and 1 from projectuser itself, oh nvm i guess thats what through='ProjectUser' does – markveltman Apr 14 '19 at 13:50
0

i now get the following problem when running this code:

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class Project(models.Model):
    projectName = models.CharField(max_length=200)
    users = models.ManyToManyField(get_user_model(), through='ProjectUser')
    projectOwner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='projectowner', default=1)

class Right(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=1000)

class ProjectUser(models.Model):
    user_id = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    project_id = models.ForeignKey(Project, on_delete=models.CASCADE)
    rights = models.ManyToManyField(Right)

ValueError: Cannot alter field wspingpong.Project.users into wspingpong.Project.users - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)