django rest framework User model 만들기

김도오·2022년 4월 29일
0

User

화면

Models.py


from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractUser)
from django.utils.translation import ugettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField


class UserManager(BaseUserManager):
	# password=None으로 놓는데 그 이유를 모르겠다.
    # **extra_fields 값을 통해서 나머지 값들이 들어감
    def create_user(self, email, username, password, **extra_fields):
        """
        주어진 이메일, 닉네임, 비밀번호 등 개인정보로 User 인스턴스 생성
        """
        if not email:
            raise ValueError(_("Users must have an email address"))
        username = self.model.normalize_username(username)
        user = self.model(
            email=self.normalize_email(email),
            username=username,
            **extra_fields
        )
        user.is_active = False
        user.is_staff = False
        user.is_superuser = False
        user.set_password(password)
        user.save(using=self._db)
        return user
        
	# **extra_fields 값을 통해서 나머지 값들이 들어감
    def create_superuser(self, email, username, password, **extra_fields):
        """
        주어진 이메일, 닉네임, 비밀번호 등 개인정보로 User 인스턴스 생성
        단, 최상위 사용자이므로 권한을 부여한다.
        """
        user = self.create_user(
            email=email,
            username=username,
            password=password,
            **extra_fields

        )
        user.is_active = True
        user.is_staff = True
        user.is_admin = True
        user.is_superuser = True
        user.level = 100
        user.save(using=self._db)
        return user


class User(AbstractUser):
    email = models.EmailField(
        verbose_name=_('Email address'),
        max_length=255,
        unique=True,
    )
    username = models.CharField(
        verbose_name=_('username'),
        max_length=30,
        unique=True
    )
    company = models.CharField(
        verbose_name=_('company name'),
        max_length=30,
        blank=True,
        null=True)
    advertisement_url = models.CharField(
        verbose_name=_('광고 URL '),
        max_length=255,
        blank=True,
        null=True)
    level = models.IntegerField(
        verbose_name=_('user level'),
        default=0)
    unique_id = models.CharField(
        verbose_name=_('google Id'),
        max_length=50,
        blank=True)
    mobile = PhoneNumberField(
        verbose_name=_('mobile phone number'),
        unique=True,
        null=False,
        blank=False,
        max_length=30, )

    naver_api_key = models.CharField(
        verbose_name=_('naver api Key'),
        max_length=255,
        blank=True,
        null=True,
        unique=True)
    is_active = models.BooleanField(
        verbose_name=_('Is active'),
        default=False
    )
    is_admin = models.BooleanField(
        verbose_name=_('Is admin'),
        default=False
    )
    created_at = models.DateTimeField(
        verbose_name=_('Date joined'),
        auto_now_add=True
    )
    updated_at = models.DateTimeField(
        verbose_name=_('Date updated'),
        auto_now=True
    )
    
    objects = UserManager()
	# 로그인할때 email 이용 
    USERNAME_FIELD = 'email'
	# 필수 데이터 입력 
    REQUIRED_FIELDS = ['username', 'mobile',]

    class Meta:
        verbose_name = '유저'
        verbose_name_plural = '%s 목록' % verbose_name
        ordering = ('-date_joined',)

    def __str__(self):
        return f'{self.email}'

serializers.py

from rest_framework import serializers

from members.models import User

# user list serializer 
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"

apis.py


from rest_framework import generics

from members.models import User
from members.serializers import UserSerializer


class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

urls.py

from django.urls import path

from members.apis import UserList

urlpatterns = [
    path('', UserList.as_view(), name="user-list")
]

0개의 댓글

관련 채용 정보