在 Django 中序列化扩展用户模型

Serialise an extended User Model in Django

我正在 Profile 模型中扩展 django 身份验证用户模型:

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    activity = models.IntegerField(default=500)

    def _str_(self):
        return self

在我看来,我得到了当前的授权用户和关联的配置文件:

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getUserProfile(request):
    profile = Profile.objects.get(user = request.user)
    serializer = profileSerializer(profile, many=False)
    return Response(serializer.data)

这是我的序列化程序代码:

from rest_framework import serializers
from .models import Profile

class profileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('first_name', 'activity')

我得到的错误是 Profie 对象没有 first_name 属性,但是当我用 'user' 替换 'first_name' 时,我只得到 id用户,所以我也想显示 first_name

谢谢

OneToOneField 将配置文件模型中的字段 user 连接到具有 first_name 属性的用户对象,但在配置文件 table 中 user 字段是只是一个数字,说明它是哪个用户对象。要访问名字,您可以这样做:

from rest_framework import serializers
from .models import Profile

class profileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

然后在您的模板中,您可以像这样显示 first_name,假设您将 person 传递给它,其中 person 是 Profile 模型的一个实例:

{{ person.user.first_name }}

我还认为为该字段使用另一个名称而不是 user 会更容易混淆。也许称它为人,例如:

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    person = models.OneToOneField(User, on_delete=models.CASCADE)
    activity = models.IntegerField(default=500)

    def _str_(self):
        return self

试试这个:

from django.contrib.auth.models import User

class profileSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(max_length=200, read_only=True)

    class Meta:
        model = Profile
        fields = ('user', 'first_name', 'activity')

    def get_first_name(self, obj):
        return User.objects.filter(id=obj.user.id).first().values_list('first_name', flat=True).last()

我能够在序列化程序中使用 Django depth 显示我想要的字段

from rest_framework import serializers
from .models import Profile
from django.contrib.auth.models import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name')


class profileSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = Profile
        fields = ('activity','user')
        depth=1