首页 > 解决方案 > python django:尝试在序列化程序`PerformerSerializer`上获取字段`username`的值时出现AttributeError

问题描述

各位程序员好,

当我尝试访问我的网址时出现以下错误,请您指出我的代码中的错误。我的序列化程序或视图中是否有任何错误。如果你发现了,我会很高兴的。

username尝试获取序列化程序上的字段值时出现 AttributeError PerformerSerializer。序列化器字段可能命名不正确,并且与User实例上的任何属性或键都不匹配。原始异常文本是:“用户”对象没有属性“用户”。

模型.py

class User(AbstractBaseUser)

username = models.CharField(_('Username'), unique=True,max_length=20)
email = models.EmailField(_('Email address'), unique=True)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)                                                                                                                                                    
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
last_login = models.DateTimeField(auto_now=True)
date_joined = models.DateTimeField(auto_now_add=True)
full_name = models.CharField(_("Full Name"), max_length=50,null=True)
date_of_birth = models.DateField(_("Date of birth"), auto_now=False, auto_now_add=False,null=True)
is_verified = models.BooleanField(_("Verified"), default=False)
profileImage = models.ImageField(_('Profile Image'),null=True, upload_to=None, height_field=None, width_field=None, max_length=100)
gender = models.CharField(_("Gender"), max_length=6, choices=GENDER_CHOICES,null=True)
profileTitle = models.CharField(_('Title'), max_length=20,null=True)
profileBio = models.TextField(_('Bio'),null=True)
profileWebsite = models.URLField(_('Website'), max_length=25,null=True)


USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email',]

objects = UserManager()

def has_perm(self,perm,obj=None):
    return self.is_admin

def has_module_perms(self,app_label):
    return True

def __str__(self):
    return self.username

def natural_key(self):
    return (self.username)




class Song(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        name = models.CharField(_("Name"), max_length=50)
        song = models.FileField(_("Song"), upload_to=None, max_length=100)
        song_image = models.ImageField(upload_to=None, height_field=None, width_field=None, max_length=100)
        likes = models.IntegerField(_("Likes"),default=0)
        views = models.IntegerField(_("Views"),default=0)
        performer = models.ManyToManyField('self',verbose_name=_("Performed By"),related_name='artist_in_song')

    def performer_user(self, username):
        performer = Song.objects.get(user__username=username)
        if not self.is_performer(performer):
            self.performer.add(performer)
            self.save()
            return True
        return False
    def is_performer(self, username): 
        return self.performer.all().filter(user__username=username).exists()

序列化程序.py

class PerformerSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')

    class Meta:
        model = Song
        fields = ('username',)

class UserSerializer(serializers.ModelSerializer):
    #id = serializers.ReadOnlyField(source='user.id')

    class Meta:
        model = User
        fields = ('id',)

class SongSerializer(serializers.ModelSerializer):
    performer = PerformerSerializer(many=True, read_only= True)
    user= UserSerializer(many=False, read_only= True)
    class Meta:
        model = Song
        fields = ('user','performer','id','name','song','song_image','likes','views')
        read_only_fields = ('likes','views')

视图.py

class SongCreateView(generics.ListCreateAPIView):
    queryset = Song.objects.all()
    serializer_class = SongSerializer
    permission_classes = [IsAuthenticated]

谢谢你。

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


推荐阅读