Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在更新中隐藏指定字段,但不在创建中隐藏_Python_Django_Django Rest Framework - Fatal编程技术网

Python 在更新中隐藏指定字段,但不在创建中隐藏

Python 在更新中隐藏指定字段,但不在创建中隐藏,python,django,django-rest-framework,Python,Django,Django Rest Framework,我只想在创建表单中显示密码字段,但不想在更新表单中显示。如果我从UserSerializer中删除密码,它将不会以两种形式出现 class UserSerializer(serializers.ModelSerializer): subscriptions = SubscriptionSerializer(many=True, read_only=True) password = serializers.CharField( style={'input_type'

我只想在创建表单中显示密码字段,但不想在更新表单中显示。如果我从UserSerializer中删除密码,它将不会以两种形式出现

class UserSerializer(serializers.ModelSerializer):
    subscriptions = SubscriptionSerializer(many=True, read_only=True)
    password = serializers.CharField(
        style={'input_type': 'password'},
        write_only=True
    )

    class Meta:
        model = User
        fields = '__all__'

    def create(self, validated_data):
        user = User.objects.create(**validated_data)
        user.set_password(validated_data["password"])
        user.save()

        return user

若将实例提供给序列化程序,则可以删除密码字段。这意味着您将更新它的实例或序列化它。在这两种情况下,您都不需要密码字段

class UserSerializer(serializers.ModelSerializer):
    subscriptions = SubscriptionSerializer(many=True, read_only=True)
    password = serializers.CharField(
        style={'input_type': 'password'},
        write_only=True
    )

    class Meta:
        model = User
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.instance:
            self.fields.pop('password')


    def create(self, validated_data):
        user = User.objects.create(**validated_data)
        user.set_password(validated_data["password"])
        user.save()

        return user

您是否考虑过对不同的表单使用不同的序列化程序?我是否应该为此创建另一个视图集,还是可以对两个序列化程序使用相同的视图集?@YuriSales否,您只需要定义一个新的序列化程序。签出viewset的get_serializer_类方法。如果重写它,则可以根据请求动态分配Serializer类