【问题标题】:Serialise an extended User Model in Django在 Django 中序列化扩展的用户模型
【发布时间】:2021-12-30 13:21:31
【问题描述】:

我在 Profile 模型中扩展 django auth 用户模型:

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,所以我想显示@987654328 @也一样。

谢谢

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    OneToOneField 将 Profile 模型中的字段 user 连接到具有 first_name 属性的 User 对象,但在 Profile 表中,user 字段只是一个数字,表示它是哪个 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 }}
    

    我也认为使用其他名称而不是用户名称会更容易混淆。可以称它为人,例如:

    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
    

    【讨论】:

    • 谢谢你的回答,它有效,但它不是我所需要的,我需要在我的视图中使用序列化程序来返回serializer.data,但即使在应用你所说的@987654330之后@ 一直将 user idactivity 作为值,就像它没有递归地显示用户字段
    • 感谢您的回复。我看到这可能不在我的知识范围内。但也许stackoverflow.com/questions/49058931/… 会有所帮助?
    • 谢谢,是的,我找到的解决方案与您分享的链接中的类似
    【解决方案2】:

    试试这个:

    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()
    

    【讨论】:

    • 感谢您的回答,我确实找到了更好的解决方案,我将分享
    【解决方案3】:

    我能够在序列化程序中使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 2016-10-12
      • 2011-02-28
      • 2013-12-06
      • 2018-01-21
      相关资源
      最近更新 更多