我有以下模型、序列化程序和 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
