Django 多對多範例

YH Lin
3 min readDec 1, 2020

--

這是一個在Django 中多對多的範例。在系統中,先秀出目前參加任務的隊伍有哪些,每隊的組員有誰。

我們定義一個myteamtask跟group 的多對多關係

定義urls.py

path('my_team_tasks_link/', views.my_team_tasks_link, name='my_team_tasks_link'),
path('create_team_tasks/', views.my_team_tasks_link, name='create_team_tasks'),

my_team_tasks_link 有兩種寫法,先來介紹第一種用through的寫法

第8行取得所有team_tasks中結束日期比今天晚而且活動有效的任務,從任務叢集中找到所有的群組。第22行的group.group指的是MyTeamTask的group

class MyTeamTask(models.Model):
group = models.ManyToManyField(Group,related_name='group')

group.group.through 指的是django 自動生成的myteamtask_group

myteamtask_ids = group.group.through.objects.filter(group_id=id).values('myteamtask_id')

指的就是mytaemtask_group 的myteamtask_id

這邊就是從task->group->through->myteamtask_id 這樣找下來。再利用list 與 set 兜成

[{‘task_name’: ‘募集點數’, ‘group_list’: [{‘group’: ‘史上最大天團沒有之一’, ‘group_id’: 1, ‘users’: [‘吳六六’, ‘李小四’, ‘張小三’]}, {‘group’: ‘史上最臭貓咪沒有之一’, ‘group_id’: 2, ‘users’: [‘吳六六’, ‘張小三’, ‘李小四’]}]}]

在html 中,需要用for each 層層拆掉

在views.py 中的my_team_tasks_link 另一種寫法是透過values 找到myteamtask_id

Group.objects.filter(id=id).values(‘group__user_id’)

--

--

No responses yet