4

我正在为User模型使用下面的序列化程序,但是当我使用深度处理外键时,密码会显示在User对象中。

用户序列化器:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        read_only_fields = ('is_active', 'is_staff', 'is_superuser',)
        exclude = ('password', )
        extra_kwargs = {'password': {'write_only': True, 'min_length': 4}}

在下面的序列化程序中一切都很好:

class AuditSerializer(serializers.ModelSerializer):
    def __init__(self, instance=None, **kwargs):
        if instance:
            setattr(self.Meta, 'depth', 10)
        else:
            setattr(self.Meta, 'depth', 0)
        super(AuditSerializer, self).__init__(instance, **kwargs)

    initiator = UserSerializer(read_only=True)

    class Meta:
        model = Audit
        fields = ['id', 'initiator']
        read_only_fields = ['id', 'initiator']
        depth = 0

但是在下面与以前的模型/序列化程序有关的内容中,我遇到了密码问题:

class AuditAttachmentSerializer(serializers.ModelSerializer):
    def __init__(self, instance=None, **kwargs):
        if instance:
            setattr(self.Meta, 'depth', 10)
        else:
            setattr(self.Meta, 'depth', 0)
        super(AuditAttachmentSerializer, self).__init__(instance, **kwargs)

    class Meta:
        model = AuditAttachment
        fields = ['id', 'audit']
        read_only_fields = ['id']
        depth = 0
4

2 回答 2

1

我在使用depthMeta 属性时遇到了同样的问题。被password集成在序列化数据中。

第一种解决方案)

在@JPG 对原始帖子的评论之后,我使用to_representation()了方法,它就像一个魅力!

我已经结束了与我的用户模型相关的序列化程序的这段代码:

from django.contrib.auth.models import Group
from rest_framework import serializers


class BaseGroupSerializer(serializers.ModelSerializer):

    class Meta:
        model = Group
        depth = 1
        fields = (
            'id',
            'name',
            'user_set',
        )
    
    def to_representation(self, instance):
        response = super().to_representation(instance)
        for user in response.get("user_set"):
            user.pop("password", None)
        return response

它只是从我的组中的每个用户中弹出密码字段。

第二种解决方案)

另一个简单的解决方案是直接引用您明确排除密码exclude = ('password',)(或不包括密码)的 UserSerializer。

就我而言,结果会是这样:

from django.contrib.auth.models import Group
from rest_framework import serializers
from ..serializers.base_user_serializer import BaseUserSerializer


class BaseGroupSerializer(serializers.ModelSerializer):

    user_set = BaseUserSerializer(many=True)       # <------

    class Meta:
        model = Group
        depth = 1
        fields = (
            'id',
            'name',
            'user_set',
        )

BaseUserSerializer原样:

from rest_framework import serializers
from ..models.base_user import User


class BaseUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        depth = 1
        fields = (
            'id',
            'username',
            'email',
            'first_name',
            'last_name',
            'full_name',
            'full_identification',
            'is_active',
            'groups',
            # 'password' is omitted here
        )

两种方式都有效。第二种方法的唯一问题是,在某些情况下,如果您还在BaseGroupSerializer.BaseUserSerializer

因此,根据您的情况和您对进口的限制,...选择您的解决方案:)

于 2021-01-27T10:23:48.557 回答
0

我删除了该__init__方法并将其更改为以下解决方案。

DRF:使用嵌套序列化程序的简单外键分配?

于 2020-07-01T06:45:28.040 回答