具有非模型只写字段的DRF ModelSerializer

2024-09-30 03:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下模型,序列化程序和视图。我的目标是传递一个自定义字符串

referrer = "pid=email&af_sub1=ui_1120&c=xyz"

在POST方法(下面的RegisterViewSet)中,然后到viewset/serializer中使用此信息来填写referral_活动、referral_media和inviting_user

所以: 1推荐人是只写字段 2referer不是模型中的字段,但该信息将用于填充模型中的字段

如何以DRF的方式实现这一点?在

型号

^{pr2}$

序列化程序

class UserSerializer(serializers.ModelSerializer):

class Meta:
    model = User
    fields = ('first_name', 'last_name',)
    write_only_fields = ('first_name', 'last_name', 'referrer')     #how to use this 'referrer' field to populate the Model fields?
    read_only_fields = ('id',)

视图

class RegisterViewSet(generics.CreateAPIView):

    model = User
    serializer_class = UserSerializer
    permission_classes = [
        permissions.AllowAny
    ]

Tags: name模型程序视图信息fieldsmodel序列化
3条回答

首先,需要在序列化程序中定义此字段:

class UserSerializer(serializers.ModelSerializer):
    referrer = serializers.CharField(max_length=300, allow_blank=True)
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'referrer')
        write_only_fields = ('first_name', 'last_name', 'referrer')     #how to use this 'referrer' field to populate the Model fields?
        read_only_fields = ('id',)

(我不太确定您是否需要“只写”字段中的“名字”、“姓氏”,因为这意味着您只能得到ID作为响应,但这取决于您的要求)

现在,您需要重写序列化程序restore\u对象方法:

^{pr2}$

(此答案假设DRF 2)

对于DRF3

class UserSerializer(serializers.ModelSerializer):
    referrer = serializers.CharField(max_length=300, allow_blank=True, write_only=True)

    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name', 'referrer')

    def validate(self, attrs):
        # do your stuff
        attrs.pop('referer', None)  # avoid sending it back to model creation
        return attrs

从这个answer

对于新来的人。drf3中不推荐使用“只写”字段。在

“额外”是一种新的方法。参见:http://www.django-rest-framework.org/topics/3.0-announcement/#the-extra_kwargs-option

示例:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    ...
    class Meta:
        model = User
        ...

        # 'write_only_fields' has been deprecated:
        #     write_only_fields = ('password',)
        extra_kwargs = {
            'password': {'write_only': True}
        }

相关问题 更多 >

    热门问题