尝试合并用户的用户名时,序列化程序工作不正常



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

这是我的序列化程序,我试图使用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
username = serializers.SerializerMethodField('_user')
def _user(self, obj):
request = self.context.get('request', None)
if request and request.user:
return request.user.username
return ''

这对你有用。

正确的遍历属性应该是

class BucketListSerializer(serializers.ModelSerializer, EagerLoadingMixin):
...
username = serializers.CharField(source='owner.username', read_only=True)
...

我认为您可以在序列化程序中使用上下文:

user = self.context['request'].user

因此,如果您想显示用户名,您可以将用户名创建为SeralizerMethodField,并从用户对象返回用户名,该对象是从请求上下文中获得的。

类BucketListSerializer(serializers.ModelSerializer(:

user = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Bucket
fields = (...'user')

def get_user(self, instance):
user = self.context['request'].user
return user