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, если вы используете этот сериализатор для модели пользователя.

Вернуться на верх