在 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
我正在 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