python - 尝试合并用户的用户名时,序列化程序无法正常工作
问题描述
我有一个序列化程序,我正在尝试从不同的模型添加一个额外的字段。目标是添加请求数据的用户的用户名。
这是我的序列化程序,我尝试使用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 ''
这对你有用。