Skip to main content
 首页 » 编程设计

python之DRF之具有非模型 write_only 字段的 ModelSerializer

2025年05月04日8bhlsheji

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

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

在POST方法中(下面的RegisterViewSet)然后到viewset/serializer使用这个信息来填写referral_campaign, referral_media and invinting_user

所以: 1. referrer是write_only字段 2. referrer 不是模型中的字段,但该信息将用于填充模型中的字段

DRF的方式如何实现?

型号

class User(AbstractUser):      
    first_name = models.CharField(max_length=100, null=True, blank=True) 
    last_name = models.CharField(max_length=100, null=True, blank=True) 
 
    # social/viral feature related fields 
    referral_campaign = models.CharField(default="", max_length = 200, help_text="Campaign that led to the user signup") 
    referral_media_source = models.CharField(default="", max_length = 200, help_text="Campaign that led to the user signup") 
    inviting_user = models.ForeignKey('self', help_text="Inviting user", null=True, blank=True) 

序列化器

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 
    ] 

请您参考如下方法:

对于 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 super().validate(attrs) 

从这这answer