首页 > 解决方案 > 尝试合并用户的用户名时,序列化程序无法正常工作

问题描述

我有一个序列化程序,我正在尝试从不同的模型添加一个额外的字段。目标是添加请求数据的用户的用户名。

这是我的序列化程序,我尝试使用username变量来完成我的目标并将其添加到字段中。

class BucketListSerializer(serializers.ModelSerializer, EagerLoadingMixin):

    stock_count = serializers.SerializerMethodField()
   
    username = serializers.CharField(source='User.username', read_only=True)

        model = Bucket
        fields = ('id','username','category','name','stock_count',
                'stock_list','owner','admin_user',
                'guest_user','about','created','slug',
                'bucket_return', 'bucket_sectors','bucket_pos_neg')

    def get_stock_count(self, obj):
        if obj.stock_count:
            return obj.stock_count
        return 0

此序列化程序没有任何语法错误,但该username字段不起作用。键返回的字典中没有数据username

用户型号:

class CustomAccountManager(BaseUserManager):

    def create_superuser(self, email, username, first_name, last_name, password, **other_fields):

        other_fields.setdefault('is_staff', True)
        other_fields.setdefault('is_superuser', True)
        other_fields.setdefault('is_active', True)

        if other_fields.get('is_staff') is not True:
            raise ValueError(
                'Superuser must be assigned to is_staff=True.')
        if other_fields.get('is_superuser') is not True:
            raise ValueError(
                'Superuser must be assigned to is_superuser=True.')

        return self.create_user(email, username, first_name, last_name, password, **other_fields)

    def create_user(self, email, username, first_name, last_name, password, **other_fields):

        if not email:
            raise ValueError(_('You must provide an email address'))

        if not username:
            raise ValueError(_('You must provide a username'))

        if not first_name:
            raise ValueError(_('You must provide your first name'))

        if not last_name:
            raise ValueError(_('You must provide your last name'))
        
        if not password:
            raise ValueError(_('You must provide a valid password'))

        email = self.normalize_email(email)
        user = self.model(email=email, username=username,
                          first_name=first_name, last_name=last_name, password=password, **other_fields)
        user.set_password(password)
        user.save()
        return user


class User(AbstractBaseUser, PermissionsMixin):

    email = CIEmailField(_('email address'), unique=True)
    username = CICharField(max_length=150, unique=True)
    first_name = models.CharField(max_length=150, blank=True)
    last_name = models.CharField(max_length=150, blank=True)
    start_date = models.DateTimeField(default=timezone.now)
    subscribed = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = CustomAccountManager()


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name','password']

    def __str__(self):
        return self.username

这是使用的视图:

class BucketList(generics.ListAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = BucketListSerializer
    filter_backends = [OwnerOrUserFilterBackend]
    queryset = Bucket.objects.all()

如何简单地将用户的用户名添加到上面的序列化程序类中?


编辑:

这是我的桶模型:


class Bucket(models.Model):

    category_options = (
        ('personal', 'Personal'),
        ('social', 'Social'),
    )


    class BucketObjects(models.Manager):
        def get_queryset(self):
            return super().get_queryset()

    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='buckets')
    admin_user = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='admin_user')
    guest_user = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='guest_user', blank=True)
    category = models.CharField(max_length=30, choices=category_options)
    name = models.CharField(max_length=35)
    created = models.DateTimeField(default=timezone.now, blank=True)
    slug = AutoSlugField(populate_from = "random_string", blank=True) 
    stock_count = models.IntegerField(blank=True, null=True)
    stock_list = ArrayField(models.CharField(max_length=6,null=True),size=30,null=True, blank=True)
    about = models.CharField(max_length=200)

    objects = models.Manager()
    bucketobjects = BucketObjects()

编辑#2

class BucketListSerializer(serializers.ModelSerializer):
   
    user = serializers.SerializerMethodField('get_user')

    class Meta:
        model = Bucket
        fields = (...'user')


    def getUsername(self, obj):
        user = self.context['request'].user
        return obj.user

标签: pythondjangodjango-rest-framework

解决方案


username = serializers.SerializerMethodField('_user')

def _user(self, obj):
    request = self.context.get('request', None)
    if request and request.user:
        return request.user.username
    return ''

这对你有用。


推荐阅读