TypeError: User() получил неожиданные аргументы ключевого слова: 'reg_data_l' & Вам может понадобиться сделать поле доступным только для чтения или переопределить UserSerializer.create()
Models.py
class User(AbstractUser, PermissionsMixin):
is_admin = models.BooleanField(default=False)
is_librarian = models.BooleanField(default=False)
is_member = models.BooleanField(default=False)
class Librarian(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
librarian_firstname = models.CharField(max_length=20)
librarian_middlename = models.CharField(max_length=20)
librarian_lastname = models.CharField(max_length=20)
CATEGORY_GENDER = (('Male','Male'),('Female','Female'))
librarian_gender = models.CharField(max_length=6, choices=CATEGORY_GENDER)
librarian_contact = models.CharField(max_length=10, unique=True, blank=True)
librarian_photo = models.ImageField(upload_to = 'media/librarian_photo', default='media/default.webp', blank=True)
librarian_address = models.CharField(max_length=100)
def __str__(self):
return str(self.librarian_firstname)+ ' - '+(self.librarian_lastname)
def save(self, *args, **kwargs):
for field_name in ['librarian_firstname', 'librarian_middlename', 'librarian_lastname']:
val = getattr(self, field_name, False)
if val:
setattr(self, field_name, val.capitalize())
super(Librarian, self).save(*args, **kwargs)
class Member(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
member_firstname = models.CharField(max_length=20)
member_middlename = models.CharField(max_length=20)
member_lastname = models.CharField(max_length=20)
CATEGORY_GENDER = (('Male','Male'),('Female','Female'))
member_gender = models.CharField(max_length=6, choices=CATEGORY_GENDER)
member_contact = models.CharField(max_length=10, unique=True, blank=True)
member_photo = models.ImageField(upload_to = 'media/member_photo', default='media/default.webp', blank=True)
member_address = models.CharField(max_length=100)
def __str__(self):
return str(self.member_firstname)+ ' - '+(self.member_lastname)
def save(self, *args, **kwargs):
for field_name in ['member_firstname', 'member_middlename', 'member_lastname']:
val = getattr(self, field_name, False)
if val:
setattr(self, field_name, val.capitalize())
super(Member, self).save(*args, **kwargs)
class Books(models.Model):
book_name = models.CharField(max_length=50)
book_author = models.CharField(max_length=30)
book_isbn = models.PositiveIntegerField()
def __str__(self):
return str(self.book_name)
serializer.py
class MemberSerializer(serializers.ModelSerializer):
class Meta:
model = Member
fields = ('member_firstname','member_middlename','member_lastname','member_gender',
'member_contact','member_photo','member_address')
class UserSerializer(serializers.ModelSerializer):
reg_data = MemberSerializer()
class Meta:
model = User
fields = ('username','password','reg_data',)
def create(self, validated_data):
reg_info = validated_data.pop('reg_data')
user_reg = User.objects.create(**validated_data)
user_reg.set_password(validated_data['password'])
user_reg.save()
Member.objects.create(user=user_reg, **reg_info)
obj = User.objects.get(id=user_reg.id)
return obj
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Books
fields = ('book_name','book_author','book_isbn')
class LibrarianSerializer(serializers.ModelSerializer):
class Meta:
model = Librarian
fields = ('librarian_firstname','librarian_middlename','librarian_lastname',
'librarian_gender','librarian_contact','librarian_photo','librarian_address')
class LibrarianUserSerializer(serializers.ModelSerializer):
reg_data_l = LibrarianSerializer()
class Meta:
model = User
fields = ('username','password','reg_data_l',)
def create(self, validated_data):
reg_info = validated_data.pop('reg_data_l')
user_reg = User.objects.create(**validated_data)
user_reg.set_password(validated_data['password'])
user_reg.save()
Librarian.objects.create(user=user_reg, **reg_info)
obj = User.objects.get(id=user_reg.id)
return obj
Views.py
class LibrarianAPI(viewsets.ModelViewSet):
queryset = Librarian.objects.all()
# authentication_classes = (JWTAuthentication, )
permission_classes = (IsAuthenticated ,)
serializer_class = UserSerializer
class MemberAPI(viewsets.ModelViewSet):
queryset = Member.objects.all()
# authentication_classes = (JWTAuthentication, )
permission_classes = (IsAuthenticated ,)
serializer_class = UserSerializer
class BooksAPI(viewsets.ModelViewSet):
queryset = Books.objects.all()
# authentication_classes = (JWTAuthentication, )
permission_classes = (IsAuthenticated ,)
serializer_class = BookSerializer
Как пользователь
- Я могу зарегистрироваться как ЛИБРАРИАНТ или ЧЛЕН, используя имя пользователя и пароль
- Я могу войти в систему, используя имя пользователя/пароль и получить токен доступа JWT
Как библиотекарь
- Я могу добавлять, обновлять и удалять Книги из системы
- Я могу добавлять, обновлять, просматривать и удалять участников из системы
Как участник
- Я могу просматривать, заимствовать и возвращать доступные книги .
- Если книга взята на время, ее статус изменится на BORROWED .
- Если книга возвращена, ее статус изменится на ДОСТУПНА
- Я могу удалить свой собственный аккаунт
Помогите пожалуйста, я застрял в этих & нужна ваша помощь. Спасибо
Вы используете reg_data_l в LibrarianUserSerializer, мета-модель которого User, но reg_data_l не существует в модели User.
Проблема заключается в этом коде.
class LibrarianUserSerializer(serializers.ModelSerializer):
reg_data_l = LibrarianSerializer()
class Meta:
model = User
fields = ('username','password','reg_data_l',)
Jest удалите req_data_l, если вы используете этот сериализатор для модели пользователя.