【问题标题】:Getting null for my profile serializer data instead of actual data为我的配置文件序列化程序数据而不是实际数据获取 null
【发布时间】:2019-11-28 19:53:24
【问题描述】:

我正在使用 Django-rest-auth 对我的用户进行身份验证,效果很好。我的模型是如何设置的,我有用于身份验证的自定义用户模型,并且我还有一个配置文件模型,该模型在创建用户时使用信号创建。

我希望当用户在其 URL 中被获取时,该用户的个人资料也会显示出来,并且我已经通过了序列化程序。

问题:我得到的是 null 而不是实际数据

我的 models.py(我没有包括一些模型,比如用户管理器、技能等,因为我觉得它们不相关)

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

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profiles')
    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, related_name='skills')
    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):

    profiles = ProfileSerializer(read_only=True)

    class Meta:
        model = User
        fields = ('pk', 'email', 'fullname', 'profiles')
        read_only_fields = ('email', 'fullname', 'profiles')

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": "opeyemi odedeyi",
        "profiles": {
            "date_of_birth": null,
            "bio": null,
            "profile_photo": null,
            "sex": null,
            "type_of_body": null,
            "feet": null,
            "inches": null,
            "lives_in": null
        }
    }
]

如何让配置文件显示在响应中?

【问题讨论】:

  • 为什么Profileclass 中的所有内容都用三引号括起来?
  • 问题的格式有误,但这不是问题

标签: python django django-rest-framework django-rest-auth


【解决方案1】:

我想问题出在您的CustomUserDetailsSerializer 上。您与 User 和 Profile 具有一对多的关系,但您没有在序列化程序的 profiles 属性中明确告诉它。您必须将many=True 参数传递给ProfileSerializer

class CustomUserDetailsSerializer(serializers.ModelSerializer):

    profiles = ProfileSerializer(many=True, read_only=True)

    class Meta:
        model = User
        fields = ('pk', 'email', 'fullname', 'profiles')
        read_only_fields = ('email', 'fullname', 'profiles')

但我很好奇你为什么要使用一对多的关系。您可以使用 OneToOneField 明确告诉一个用户只能拥有一个配置文件。但我不熟悉你的情况,所以这只是我的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多