Group?
Django의 migrate를 실행하게 되면 Django 설정에 의해 auth_group, xxx_groups, auth_group_permissions라는 테이블이 생성되는 것을 알 수 있는데 이번 포스팅은 이 세 테이블에 데이터를 추가하려면 어떻게 해야 되는지 정리한 글이다.
auth_group
위 테이블은 Django User Model에 생성된 데이터 즉, 사용자를 그룹으로 묶어주는 역할을 하는 테이블이다. 기본적으로 정의된 필드는 다음과 같다.
Field|Type |Null|Key|Default|Extra |
-----+------------+----+---+-------+--------------+
id |int(11) |NO |PRI| |auto_increment|
name |varchar(150)|NO |UNI| | |
그룹명(name)은 최대 150자이다. 이 테이블에 데이터를 추가하려면 다음과 같은 Django-Builtin 객체를 import 하자.
from django.contrib.auth.models import Group
새 Group을 생성하는 간단하다. 위에서 import된 Group Model을 이용해 Django ORM을 사용하여 생성하도록 하자.
>>> g1 = Group.objects.create(name="test_01")
(0.009) | INSERT INTO `auth_group` (`name`)
| VALUES ('test_01')
위에서 생성된 Group를 삭제해보자.
>>> g1 = Group.objects.get(name="test_01")
(0.009) | SELECT `auth_group`.`id`,
| `auth_group`.`name`
| FROM `auth_group`
| WHERE `auth_group`.`name` = 'test_01'
| LIMIT 21
>>> g1.delete()
(0.011) | SELECT `group_subscribe`.`reference_id`
| FROM `group_subscribe`
| WHERE `group_subscribe`.`group_id` IN (5)
(0.007) | SELECT `publish_group_history`.`reference_id`,
| `publish_group_history`.`group_id`,
| `publish_group_history`.`member_id`,
| `publish_group_history`.`subscribe_id`,
| `publish_group_history`.`date_of_create`
| FROM `publish_group_history`
| WHERE `publish_group_history`.`group_id` IN (5)
(0.006) | DELETE
| FROM `auth_group_permissions`
| WHERE `auth_group_permissions`.`group_id` IN (5)
(0.004) | DELETE
| FROM `member_groups`
| WHERE `member_groups`.`group_id` IN (5)
(0.007) | DELETE
| FROM `auth_group`
| WHERE `auth_group`.`id` IN (5)
Group을 삭제할 때는 좀 더 복잡한 과정이 일어난다. 해당 Group과 연계되어있는 테이블인 `auth_group_permissions`, `xxxx_groups`, `auth_group`에서도 해당 group의 pk로 삭제가 일어난다 `xxxx_groups`의 `xxxx`는 사용자 모델의 테이블 명이다.
하지만 `publish_group_history`와 `group_subscribe`의 테이블은 SELECT 쿼리만 일어난다. 이는 Group이 삭제될 때의 행동을 지정할 수 있는 on_delete옵션에 models.SET_NULL을 설정한 결과이다.
xxxx_groups
이 테이블은 auth_group과 사용자 정보를 연결해주는 Cross Table이다. 즉 그룹의 멤버를 관리하는 테이블이라고 생각하면 편하다. `xxxx` 부분에는 Django User Model의 이름이 들어갈 것이다. Django User Model을 따로 커스텀하지 않았다면 `auth_user_groups`가 생성될 것이다. 이 테이블의 정의는 다음과 같다.
Field |Type |Null|Key|Default|Extra |
---------+----------+----+---+-------+--------------+
id |bigint(20)|NO |PRI| |auto_increment|
member_id|bigint(20)|NO |MUL| | |
group_id |int(11) |NO |MUL| | |
Django 사용자 모델을 따로 커스텀하지 않았다면 member_id가 user_id로 생성되었을 것이다. 이 테이블에 데이터를 집어넣는 것, 즉 그룹에 멤버를 추가하는 행위는 다음과 같다.
>>> g1 = Group.objects.create(name='test_01')
(0.010) | INSERT INTO `auth_group` (`name`)
| VALUES ('test_01')
>>> user1 = Member.objects.get(id=1)
>>> user1.groups.add(g1)
(0.005) | INSERT
| IGNORE INTO `member_groups` (`member_id`, `group_id`)
| VALUES (1, 6)
xxxx_groups를 ORM으로 찾은 다음에 넣는 방식이 아닌, 특정 사용자를 찾고 그 사용자 객체의 groups 메서드를 이용한다.
auth_group_permissions
이 테이블은 그룹 단위로 permissions을 정보를 관리하는 테이블이다. 이 테이블은 `auth_group`과 `auth_permission`의 크로스 테이블이다. 테이블 정보는 다음과 같다.
Field |Type |Null|Key|Default|Extra |
-------------+----------+----+---+-------+--------------+
id |bigint(20)|NO |PRI| |auto_increment|
group_id |int(11) |NO |MUL| | |
permission_id|int(11) |NO |MUL| | |
이 테이블에 데이터를 추가하려면 다음과 같은 코드가 필요하다.
>>> g1 = Group.objects.get(name="test_01")
(0.005) | SELECT `auth_group`.`id`,
| `auth_group`.`name`
| FROM `auth_group`
| WHERE `auth_group`.`name` = 'test_01'
| LIMIT 21
>>> permission = Permission.objects.get(codename="add_emailhistory")
(0.007) | SELECT `auth_permission`.`id`,
| `auth_permission`.`name`,
| `auth_permission`.`content_type_id`,
| `auth_permission`.`codename`
| FROM `auth_permission`
| WHERE `auth_permission`.`codename` = 'add_emailhistory'
| LIMIT 21
>>> g1.permissions.add(permission)
(0.005) | INSERT
| IGNORE INTO `auth_group_permissions` (`group_id`, `permission_id`)
| VALUES (6, 29)
Permission 객체는 Django에서 제공하는 Permission 클래스를 import 해야 한다.
from django.contrib.auth.models import Permission
'Frame Work > Django' 카테고리의 다른 글
[Django] show_urls 흉내내기 (0) | 2023.04.09 |
---|---|
Django project를 src layout으로 구성하기 (0) | 2023.01.30 |
uWSGI Socket + Nginx + Docker (0) | 2022.11.10 |
uWSGI를 알아보자 (0) | 2022.11.05 |
[Django] OneToOne Relation (0) | 2022.06.06 |