본문 바로가기

Frame Work/Django

[Django] auth_group 다루기

728x90
반응형

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

 

 

 

728x90
반응형

'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