Nae*_*han 1 python django many-to-many
我有以下型号:
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)
Run Code Online (Sandbox Code Playgroud)
的数据库表project_users如下所示:
*--------*----------------*---------------------*
| ID | project_id | user_account_id |
*--------*----------------*---------------------*
Run Code Online (Sandbox Code Playgroud)
我想在project_users字段/表中与Discipline模型建立额外的关系。这在 Django 中可能吗?我一直在研究Django 中的中介多关系,但这并不是我想要的。在我的应用程序中,有一定数量的学科,我想要实现的是在单个项目中为每个用户提供多个学科。所以像这样:
*--------*----------------*---------------------*-------------------*
| ID | project_id | user_account_id | discipline_id |
*--------*----------------*---------------------*-------------------*
Run Code Online (Sandbox Code Playgroud)
这可能吗?
您可以创建一个引用三个模型的模式,这实际上就是 aManyToManyField在幕后所做的事情:在两者之间创建一个模型。
class UserProjectDiscipline(models.Model):
user_account = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
project = models.ForeignKey(
Project,
on_delete=models.CASCADE
)
discipline = models.ForeignKey(
Discipline,
on_delete=models.CASCADE
)Run Code Online (Sandbox Code Playgroud)
您现在可以使用, and访问UserProjectDisciplinea UserAccount,Project和/或的Disciplines 。myuser.userprojectdiscipline_set.all()myproject.userprojectdiscipline_set.all()mydiscipline.userprojectdiscipline_set.all()
此外,您可以定义ManyToManyField跨越该表的 s,这样就可以轻松获取Projecta 的相关 sDiscipline等,方法是:
class Project(models.Model):
project_name = models.CharField(max_length=50)
users = models.ManyToManyField(
'Users.UserAccount',
through='UserProjectDiscipline',
related_name='projects',
blank=True
)
disciplines = models.ManyToManyField(
'Discipline',
through='UserProjectDiscipline',
related_name='projects',
blank=True
)
# …
class UserAccount(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=30, unique=True)
disciplines = models.ManyToManyField(
'Discipline',
through='UserProjectDiscipline',
related_name='users',
blank=True
)
# …Run Code Online (Sandbox Code Playgroud)
然后,这些将在 的表上进行联接,UserProjectDiscipline以有效地检索给定项目的用户等。如果您需要 的对象UserProjectDiscipline,您仍然可以使用例如myproject.userprojectdiscipline_set.all()。
因此,如果您想为用户提供myuser给定项目的三个学科myproject,您可以使用以下命令添加这些学科:
UserProjectDiscipline.objects.bulk_create([
UserProjectDiscipline(user_account=myuser, project=my_project, discipline=mydiscipline1),
UserProjectDiscipline(user_account=myuser, project=my_project, discipline=mydiscipline2),
UserProjectDiscipline(user_account=myuser, project=my_project, discipline=mydiscipline3)
])Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2177 次 |
| 最近记录: |