根据Django Rest中的数据创建序列化字段



我正在为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()

拥有两个独立的序列化器将使代码更清晰,更容易理解和维护

相关内容

  • 没有找到相关文章

最新更新