我正在为Auth编写api。我有2个用户类型(捐助者,慈善机构),当他们做注册我的数据正在变化。因此,我需要根据数据更新我的字段。
这是我目前所做的。
views.py
class RegisterView(APIView):
def post(self, request):
js_data = request.data
if 'last_name' in js_data:
#fields = ['id', 'email', 'first_name', 'last_name', 'password']
serializer = UserSerializer(data=js_data)
serializer.is_valid(raise_exception=True)
serializer.save()
else:
#fields = ['id', 'email', 'first_name', 'postcode', 'password']
serializer = UserSerializer(data=js_data)
serializer.is_valid(raise_exception=True)
serializer.save()
我试图从外部serializers.py定义字段,但我不能将字段作为参数发送。
serializer = UserSerializer(data=js_data, fields = fields) # gives error.
我也试过这个;
serializer = UserSerializer(data=js_data, many= True, fields = fields) # gives error
所以我尝试动态创建字段。
serializer.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = []
extra_kwargs = {'password': {'write_only': True} }
def create(self, validated_data):
if 'last_name' in validated_data:
self.Meta.fields = ['id', 'email', 'first_name', 'last_name', 'password']
else:
self.Meta.fields = ['id', 'email', 'first_name', 'postcode', 'password']
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
所以在这里我试图改变字段在创建函数。我没有得到一个错误,但在数据库中我的字段是空的:(也许我定义fields = []
作为一个空列表,这就是为什么字段是空的,不保存用户的任何数据。
Btw,我开始学习django rest。我不熟悉这个框架,所以我很抱歉任何错误的定义等。
那么根据数据创建字段有什么想法吗?提前感谢。祝你过得愉快。
最好的解决方案是有两个独立的序列化器:
- 创建2个不同的序列化器,每个序列化器都有自己的逻辑和字段
- 如果某些逻辑在两个序列化器之间共享,只需创建一个具有共享逻辑的父类,并使它们从它继承 在您看来,只需根据您的需要选择序列化器,如下所示:
if 'last_name' in js_data:
serializer = SerializerOne(data=js_data)
else:
serializer = SerializerTwo(data=js_data)
serializer.is_valid(raise_exception=True)
serializer.save()
拥有两个独立的序列化器将使代码更清晰,更容易理解和维护