我有以下型號:
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)
的 DB 表project_users如下所示:
*--------*----------------*---------------------*
| ID | project_id | user_account_id |
*--------*----------------*---------------------*
我想在project_users欄位/表中與Discipline模型建立額外的關系。這在 Django 中可能嗎?我一直在研究 Django中的中介-多對多關系,但這并不是我想要的。在我的應用程式中,有一定數量的學科,我試圖實作的是在單個專案中為每個用戶提供多個學科。所以像這樣:
*--------*----------------*---------------------*-------------------*
| ID | project_id | user_account_id | discipline_id |
*--------*----------------*---------------------*-------------------*
這可能嗎?
uj5u.com熱心網友回復:
您可以創建一個參考三個模型的模式,這實際上就是 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
)
您現在可以訪問 a 的UserProjectDisciplines UserAccount,Project和/或Discipline使用myuser.userprojectdiscipline_set.all(),myproject.userprojectdiscipline_set.all()和mydiscipline.userprojectdiscipline_set.all()。
此外,您可以定義ManyToManyField跨越該表的 s,以便使用以下方法輕松獲取ProjectaDiscipline等的相關s :
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
)
# …
然后這些將在 的表上進行 JOINUserProjectDiscipline以有效地檢索給定專案的用戶等。如果您需要 的物件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)
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/402310.html
標籤:
