180

How would I add a user to a group in django by the group's name?

I can do this:

user.groups.add(1) # add by id

How would I do something like this:

user.groups.add(name='groupname') # add by name
MD. Khairul Basar
  • 4,976
  • 14
  • 41
  • 59
David542
  • 104,438
  • 178
  • 489
  • 842
  • Is this solution version sensitive? When I tried this is django 1.8, I got "unexpected keyword: name" – rschwieb Aug 08 '16 at 20:17

4 Answers4

341

Find the group using Group model with the name of the group, then add the user to the user_set

from django.contrib.auth.models import Group
my_group = Group.objects.get(name='my_group_name') 
my_group.user_set.add(your_user)
juankysmith
  • 11,839
  • 5
  • 37
  • 62
  • 32
    Thanks for this. It seems silly that some of the most basic things are either missing or hard to find in the django docs – Francis Yaconiello Sep 01 '11 at 15:38
  • 1
    https://docs.djangoproject.com/en/dev/intro/tutorial01/ There are similar examples in section 'Playing with the API' – juankysmith Sep 01 '11 at 17:02
  • 12
    The tutorial is pretty useful, What I meant was that I would expect to see in a section of the docs under auth for programmatically creating groups. instead all there is is a weak paragraph: https://docs.djangoproject.com/en/1.3/topics/auth/#groups I guess it helps to keep in mind that the auth models are just regular models, and the standard model reference applies. – Francis Yaconiello Sep 01 '11 at 18:41
  • where is `user_set` in Django doc? I cannot find it anywhere – Minh Thai Apr 10 '19 at 07:07
  • 1
    @MinhThai the default value for a reverse relation field is `_set` when `related_name` is not set on the field. – sox supports the mods Oct 22 '19 at 09:45
132

Here's how to do this in modern versions of Django (tested in Django 1.7):

from django.contrib.auth.models import Group
group = Group.objects.get(name='groupname')
user.groups.add(group)
coredumperror
  • 8,471
  • 6
  • 33
  • 42
  • 1
    you can also do `Group.objects.get_by_natural_key('groupname')`, but it doesn't make it shorted :D – CpILL Feb 02 '17 at 01:18
  • 2
    @enchance Wherever you need to do so. Probably within the code for a View that's doing Group assignments. – coredumperror Jun 09 '17 at 16:35
10

coredumperror is right but I have found one thing I need to share that one

from django.contrib.auth.models import Group

# get_or_create return error due to 
new_group = Group.objects.get_or_create(name = 'groupName')
print(type(new_group))       # return tuple

new_group = Group.objects.get_or_create(name = 'groupName')
user.groups.add(new_group)   # new_group as tuple and it return error

# get() didn't return error due to 
new_group = Group.objects.get(name = 'groupName')
print(type(new_group))       # return <class 'django.contrib.auth.models.Group'>

user = User.objects.get(username = 'username')
user.groups.add(new_group)   # new_group as object and user is added
1

You can assign multiple groups to a user using the set method:

from django.contrib.auth.models import Group

users = Group.objects.get(name="user")
managers = Group.objects.get(name="manager")
user.groups.set([users, managers])
Rufat
  • 536
  • 1
  • 8
  • 25