以编程方式使用 django Rest 框架将用户添加到组

1 django python-3.6

我希望能够在创建时将用户附加到组。

这是 select * from auth_group 的结果:

图像截图

这是我的 serializer.py 文件:

from rest_framework import serializers

from .models import User


class UserSerializer(serializers.ModelSerializer):

class Meta(object):
    model = User
    fields = ('id', 'email', 'first_name', 'last_name', 'phone', 'address', 'is_active', 'is_staff',
              'is_superuser', 'date_joined', 'password',)
    extra_kwargs = {'password': {'write_only': True}}
Run Code Online (Sandbox Code Playgroud)

这是我的 model.py 文件:

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin, UserManager, Group
from django.db import models, transaction

# Create your models here.
from django.utils import timezone


class UserManager(BaseUserManager):

    def _create_user(self, email, password, **extra_fields):
    """
    Creates and saves a User with the given email,and password.
    """
    if not email:
        raise ValueError('User must have an email address')
    email = self.normalize_email(email)
    if not extra_fields["group_id"]:
        raise ValueError('User must have group id')
    try:
        with transaction.atomic():
            user = self.model(email=email, **extra_fields)
            group = Group.objects.get(extra_fields["group_id"])
            group.user_set.add(user)
            user.set_password(password)
            user.save(using=self._db)
            return user
    except:
        raise

def create_user(self, email, password=None, **extra_fields):
    extra_fields.setdefault('is_staff', False)
    extra_fields.setdefault('is_superuser', False)
    return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)

    return self._create_user(email, password=password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
"""
An abstract base class implementing a fully featured User model with
admin-compliant permissions.

"""
email = models.EmailField(max_length=40, unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
phone = models.CharField(max_length=20, blank=True)
address = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)

objects = UserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name', 'phone']

def get_full_name(self):
    """" Used to display user's full name """
    return "{}, {}".format(self.first_name, self.last_name)

def __srt__(self):
    return self.email

def save(self, *args, **kwargs):
    super(User, self).save(*args, **kwargs)
    return self
Run Code Online (Sandbox Code Playgroud)

最后,这是我的 view.py:

class CreateUserAPIView(APIView):
# Allow any user (authenticated or not) to access this url
permission_classes = (AllowAny,)

def post(self, request):
    user = request.data
    serializer = UserSerializer(data=user)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response({"user": serializer.data, "status": status.HTTP_200_OK})
Run Code Online (Sandbox Code Playgroud)

我想要这个请求:

{
"email": "myemail@gmail.com",
"first_name": "myfirst_name",
"last_name": "mylast_name",
"phone": "000556660",
"address": "myaddress",
"password": "mypassword",
"group_id": 5
}
Run Code Online (Sandbox Code Playgroud)

要获得此响应:

{
"status": 200,
user: {
"email": "myemail@gmail.com",
"first_name": "myfirst_name",
"last_name": "mylast_name",
"phone": "000556660",
"address": "myaddress",
"password": "mypassword",
"groups": [5]
}
}
Run Code Online (Sandbox Code Playgroud)

我已经点击此链接将用户添加到 django 中的组,但这对我没有帮助。

谢谢,任何帮助将不胜感激。

Bis*_*rki 5

尝试这个 :

class UserSerializers(serializers.ModelSerializer):
# groups = GroupSerializer(many=True)

class Meta:
    model = User
    fields = ('id', 'email', 'first_name', 'last_name', 'phone', 'address', 'is_active', 'is_staff',
          'is_superuser', 'date_joined', 'password', 'groups')

def create(self, validated_data):
    groups_data = validated_data.pop('groups')
    user = User.objects.create(**validated_data)
    for group_data in groups_data:
        # Group.objects.create(user=user, **group_data)
        user.groups.add(group_data)
    return user
Run Code Online (Sandbox Code Playgroud)

编辑:因为UserGroup是多对多关系,所以您可以直接groupusers序列化器中添加该字段。有关更多详细信息,请关注django.contrib.auth.models包并User继承AbstactUserAbstractUser继承PermissionsMixin,其中具有groups多对多字段。