Как правильно написать пользовательскую модель и менеджер в Django v3? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть пользовательская модель, как показано ниже

class User(AbstractBaseUser, PermissionsMixin):
    class Type:
        FP = 'fp'
        BRANCH = 'branch'
        CHOICES = (
            (FP, '채용공고 보기'),
            (BRANCH, '채용공고 내기'),
        )

    class Sex:
        MALE = 'male'
        FEMALE = 'female'
        CHOICES = (
            (MALE, '남성'),
            (FEMALE, '여성')
        )

    type = models.CharField(
        max_length=10,
        verbose_name='계정 종류',
        choices=Type.CHOICES,
    )
    email = models.EmailField(
        verbose_name='이메일',
        unique=True,
    )
    name = models.CharField(
        max_length=10,
        verbose_name='이름'
    )
    nickname = models.CharField(
        max_length=10,
        verbose_name='닉네임',
        unique=True,
    )
    phone = models.CharField(
        max_length=20,
        verbose_name='전화번호',
    )
    sex = models.CharField(
        max_length=10,
        verbose_name='성별',
        choices=Sex.CHOICES,
    )
    company_name = models.CharField(
        verbose_name='회사이름',
        max_length=256,
    )
    dob = models.DateTimeField(
        verbose_name='생년월일'
    )
    profile_img = models.ImageField(
        verbose_name='프로필 이미지',
        upload_to=user_profile_img_file_path,
    )
    sns_id = models.TextField(
        verbose_name='SNS ID'
    )
    sns_type = models.CharField(
        verbose_name='SNS 종류',
        max_length=20,
    )

    objects = UserManager()

    USERNAME_FIELD = 'email'

и пользовательский менеджер, как показано ниже

class UserManager(BaseUserManager):
    def create_user(self, email, password, **extra_fields):
        sys.stderr.write(repr(extra_fields))

        if not email:
            raise ValueError('이메일은 필수사항입니다')
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, email, password):
        user = self.create_user(email, password)
        user.is_superuser = True
        user.save(using=self._db)

        return user

, и тест выглядит как ниже

    def test_create_valid_user_success(self):
        """
        Test that creating user with valid payload is successful
        """
        profile_img = self.generate_photo_file()

        payload = {
            'email': 'test@gmail.com',
            'password': '1234567',
            'type': 'fp',
            'name': 'testname',
            'nickname': 'testnickname',
            'phone': '01012341234',
            'sex': 'male',
            'company_name': 'company_name',
            'dob': '1992-11-23T10:22:38+0000',
            'profile_img': profile_img,
            'sns_id': '1234567',
            'sns_type': 'facebook',
        }

        res = self.client.post(CREATE_USER_URL, payload)
        sys.stderr.write(repr(res))

        self.assertEqual(res.status_code, status.HTTP_201_CREATED)
        user = get_user_model().objects.get(**res.data)
        self.assertTrue(user.check_password(payload['password']))
        self.assertNotIn('password', res.data)

к сожалению, я продолжаю получать ошибку ниже, когда я запускаю вышеупомянутый тест

 Direct assignment to the forward side of a many-to-many set is prohibited. Use groups.set() instead.

Я не большой эксперт по django; однако, насколько я знаю, то, что я делаю выше, довольно стандартно, и у меня нет никакой связи в пользовательской модели.

Даже более странное поведение заключается в том, что, если я непосредственно создаю пользователя с той же полезной нагрузкой, не используя APIClient, он работает без нареканий. Что не так с моим тестом?

1 Ответ

0 голосов
/ 28 февраля 2020

Обычно не рекомендуется писать пользовательскую модель и менеджер, если вам это действительно не нужно. Если вы просто хотите расширить пользовательскую модель, то вы обычно подходите к этому, создавая другую модель с отношением OneToOne к пользовательской модели.

Это указано в официальных документах - https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#extending - существующий пользователь-модель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...