使用AbstractBaseUser和BaseUserManager在Django RestFramework中定制模型。

huangapple go评论94阅读模式
英文:

customize models in Django RestFramework using AbstractBaseUser, BaseUserManager

问题

我想自定义模型,所以我使用了AbstractBaseUser和BaseUserManager。我使用**extra_field来添加'point'属性。

我访问了http://127.0.0.1:8000/account/signup/并输入了我的数据,但出现了错误。

我的代码有什么问题?我是初学者,请帮帮我。

英文:

i wanna customize models. so i used AbstractBaseUser, BaseUserManager
i use **extra_field to add 'point' attribute.

i enterd http://127.0.0.1:8000/account/signup/
and write my data
but the errors occured

enter image description here

what's wrong with my code?
i'm a beginner, plz help me

  1. # serializers.py
  2. from .models import User
  3. from rest_framework import serializers
  4. class UserSerializer(serializers.ModelSerializer):
  5. def create(self, validated_data):
  6. user = User.objects.create_user(
  7. email = validated_data['email'],
  8. nickname = validated_data['nickname'],
  9. name = validated_data['name'],
  10. password = validated_data['password'],
  11. point = validated_data['point']
  12. )
  13. return user
  14. class Meta:
  15. model = User
  16. fields = ['name', 'nickname', 'email', 'password']
  1. # models.py
  2. from django.db import models
  3. from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
  4. class UserManager(BaseUserManager):
  5. def create_user(self, email, nickname, name, password=None, **point):
  6. if not email:
  7. raise ValueError('must have user email')
  8. if not nickname:
  9. raise ValueError('must have user nickname')
  10. if not name:
  11. raise ValueError('must have user name')
  12. user = self.model(
  13. email = self.normalize_email(email),
  14. nickname = nickname,
  15. name = name,
  16. point = point
  17. )
  18. user.set_password(password)
  19. user.save(using=self._db)
  20. return user
  21. def create_superuser(self, email, nickname, name, password=None):
  22. user = self.create_user(
  23. email,
  24. password = password,
  25. nickname = nickname,
  26. name = name
  27. )
  28. user.is_admin = True
  29. user.save(using=self._db)
  30. return user
  31. class User(AbstractBaseUser):
  32. id = models.AutoField(primary_key=True)
  33. email = models.EmailField(default='', max_length=100, null=False, blank=False, unique=True)
  34. nickname = models.CharField(default='', max_length=100, null=False, blank=False, unique=False)
  35. name = models.CharField(default='', max_length=100, null=False, blank=False)
  36. point = models.IntegerField(default=500, max_length=10000000)
  37. is_active = models.BooleanField(default=True)
  38. is_admin = models.BooleanField(default=False)
  39. objects = UserManager()
  40. USERNAME_FIELD = 'email'
  41. REQUIRED_FIELDS = ['email', 'name', 'nickname', 'password']
  42. def __str__(self):
  43. return self.name
  1. # views.py
  2. from django.shortcuts import render
  3. from .serializers import UserSerializer
  4. from .models import User
  5. from rest_framework import generics
  6. # 회원가입
  7. class UserCreate(generics.CreateAPIView):
  8. queryset = User.objects.all()
  9. serializer_class = UserSerializer
  1. # urls.py
  2. from django.urls import path, include
  3. from . import views
  4. from rest_framework import urls
  5. urlpatterns =[
  6. path('signup/', views.UserCreate.as_view()),
  7. path('api-auth/', include('rest_framework.urls')),
  8. ]

i wanna customize models. so i used AbstractBaseUser, BaseUserManager
i use **extra_field to add 'point' attribute.

i enterd http://127.0.0.1:8000/account/signup/
and write my data
but the errors occured

what's wrong with my code?
i'm a beginner, plz help me

答案1

得分: 0

当你使用 ** 解包值时,你应该这样访问这些值:

  1. def create_user(self, email, nickname, name, password=None, **kwargs):
  2. if not email:
  3. raise ValueError('必须提供用户邮箱')
  4. if not nickname:
  5. raise ValueError('必须提供用户昵称')
  6. if not name:
  7. raise ValueError('必须提供用户姓名')
  8. user = self.model(
  9. email = self.normalize_email(email),
  10. nickname = nickname,
  11. name = name,
  12. point = kwargs['point']
  13. )
  14. user.set_password(password)
  15. user.save(using=self._db)
  16. return user

注意我如何获取 point 的值。问题在于你对 point 的定义是 { point: 500 }。所以它是一个字典。你需要从该字典中获取 point 的值。

英文:

When you unpack values using ** then you should access the values like this:

  1. def create_user(self, email, nickname, name, password=None, **kwargs):
  2. if not email:
  3. raise ValueError('must have user email')
  4. if not nickname:
  5. raise ValueError('must have user nickname')
  6. if not name:
  7. raise ValueError('must have user name')
  8. user = self.model(
  9. email = self.normalize_email(email),
  10. nickname = nickname,
  11. name = name,
  12. point = kwargs['point']
  13. )
  14. user.set_password(password)
  15. user.save(using=self._db)
  16. return user

Check how I get the value of point. The thing is that your definition of point is { point: 500 }. So is a dict. You need to get the value of point from that dict.

huangapple
  • 本文由 发表于 2023年2月13日 23:49:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/75438186.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定