我的配置文件对象没有在用户序列化程序中序列化
my profile object is not getting serialized in the user serializer
我正在使用 Django rest auth 来验证我的用户,效果很好。我的模型是如何设置的,我有用于身份验证的自定义用户模型,我还有一个用信号创建的配置文件模型。
我希望在 URL 中获取用户时,该用户的配置文件也称为用户中的对象。
我的 models.py(我没有包括一些模型,例如用户管理器、技能,e.t.c,因为我觉得它们不相关)
class User(AbstractBaseUser, PermissionsMixin):
username = None
email = models.EmailField(max_length=254, unique=True)
fullname = models.CharField(max_length=250)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['fullname']
objects = UserManager()
class Profile(models.Model):
'''
Note:
profile photo is expecting photos link gotten from cloudnairy from the frontend
- The height is calculated in feets and inches
- Need to sort out location (lives in)
- Need to add an age function
- Need to add achievemnet as a foreign field
- Need to add education also as a foreign field
- Add follow functionality
'''
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
date_of_birth = models.DateField(blank=True, verbose_name="DOB", null=True)
bio = models.TextField(max_length=500, blank=True, null=True)
profile_photo = models.CharField(blank=True, max_length=300, null=True)
skills = models.ManyToManyField(Skill)
sex = models.CharField(max_length=1, choices=SEX, blank=True, null=True)
type_of_body = models.CharField(max_length=8, choices=BODYTYPE, blank=True, null=True)
feet = models.PositiveIntegerField(blank=True, null=True)
inches = models.PositiveIntegerField(blank=True, null=True)
lives_in = models.CharField(max_length=50, blank=True, null=True)
updated_on = models.DateTimeField(auto_now_add=True)
serializers.py代码
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = "__all__"
read_only_fields = ('pk',)
class CustomUserDetailsSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True)
class Meta:
model = User
fields = ('pk', 'email', 'fullname', 'profile')
read_only_fields = ('email', 'fullname', 'profile')
view.py
class ListUsersView(APIView):
permission_classes = [AllowAny]
def get(self, request):
user = User.objects.all()
serializer = CustomUserDetailsSerializer(user, many=True)
return Response(serializer.data)
urls.py
url(r'^list-users/$', ListUsersView.as_view(), name='list-users'),
我得到的JSON回应
[
{
"pk": 1,
"email": "opeyemiodedeyi@gmail.com",
"fullname": "opeyemiodedeyi"
},
{
"pk": 2,
"email": "odedeyiopeyemi94@gmail.com",
"fullname": "opeyemi odedeyi"
}
]
如何让配置文件显示在响应中?
方法一
使用source
(DRF doc)参数
class CustomUserDetailsSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True, <b>source="profile_set"</b>)
class Meta:
model = User
fields = ('pk', 'email', 'fullname', 'profile')
read_only_fields = ('email', 'fullname', 'profile')
因为Profile与User是反向关系,所以需要指定reverse lookup,也就是 profile_set
方法二
改变related_name
(Django doc)模型,
class Profile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, <b>related_name='profile'</b>)
...
建议的更改
# models.py
class Profile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, <b>related_name='profiles'</b>)
...
# serializers.py
class CustomUserDetailsSerializer(serializers.ModelSerializer):
<b>profiles</b> = ProfileSerializer(read_only=True)
class Meta:
model = User
fields = ('pk', 'email', 'fullname', <b>'profiles'</b>)
read_only_fields = ('email', 'fullname', <b>'profiles'</b>)
参考资料
我正在使用 Django rest auth 来验证我的用户,效果很好。我的模型是如何设置的,我有用于身份验证的自定义用户模型,我还有一个用信号创建的配置文件模型。
我希望在 URL 中获取用户时,该用户的配置文件也称为用户中的对象。
我的 models.py(我没有包括一些模型,例如用户管理器、技能,e.t.c,因为我觉得它们不相关)
class User(AbstractBaseUser, PermissionsMixin):
username = None
email = models.EmailField(max_length=254, unique=True)
fullname = models.CharField(max_length=250)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['fullname']
objects = UserManager()
class Profile(models.Model):
'''
Note:
profile photo is expecting photos link gotten from cloudnairy from the frontend
- The height is calculated in feets and inches
- Need to sort out location (lives in)
- Need to add an age function
- Need to add achievemnet as a foreign field
- Need to add education also as a foreign field
- Add follow functionality
'''
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
date_of_birth = models.DateField(blank=True, verbose_name="DOB", null=True)
bio = models.TextField(max_length=500, blank=True, null=True)
profile_photo = models.CharField(blank=True, max_length=300, null=True)
skills = models.ManyToManyField(Skill)
sex = models.CharField(max_length=1, choices=SEX, blank=True, null=True)
type_of_body = models.CharField(max_length=8, choices=BODYTYPE, blank=True, null=True)
feet = models.PositiveIntegerField(blank=True, null=True)
inches = models.PositiveIntegerField(blank=True, null=True)
lives_in = models.CharField(max_length=50, blank=True, null=True)
updated_on = models.DateTimeField(auto_now_add=True)
serializers.py代码
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = "__all__"
read_only_fields = ('pk',)
class CustomUserDetailsSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True)
class Meta:
model = User
fields = ('pk', 'email', 'fullname', 'profile')
read_only_fields = ('email', 'fullname', 'profile')
view.py
class ListUsersView(APIView):
permission_classes = [AllowAny]
def get(self, request):
user = User.objects.all()
serializer = CustomUserDetailsSerializer(user, many=True)
return Response(serializer.data)
urls.py
url(r'^list-users/$', ListUsersView.as_view(), name='list-users'),
我得到的JSON回应
[
{
"pk": 1,
"email": "opeyemiodedeyi@gmail.com",
"fullname": "opeyemiodedeyi"
},
{
"pk": 2,
"email": "odedeyiopeyemi94@gmail.com",
"fullname": "opeyemi odedeyi"
}
]
如何让配置文件显示在响应中?
方法一
使用source
(DRF doc)参数
class CustomUserDetailsSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True, <b>source="profile_set"</b>)
class Meta:
model = User
fields = ('pk', 'email', 'fullname', 'profile')
read_only_fields = ('email', 'fullname', 'profile')
因为Profile与User是反向关系,所以需要指定reverse lookup,也就是 profile_set
方法二
改变related_name
(Django doc)模型,
class Profile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, <b>related_name='profile'</b>)
...
建议的更改
# models.py
class Profile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, <b>related_name='profiles'</b>)
...
# serializers.py
class CustomUserDetailsSerializer(serializers.ModelSerializer):
<b>profiles</b> = ProfileSerializer(read_only=True)
class Meta:
model = User
fields = ('pk', 'email', 'fullname', <b>'profiles'</b>)
read_only_fields = ('email', 'fullname', <b>'profiles'</b>)