【问题标题】:Create serializer fields according to the data in Django Rest根据 Django Rest 中的数据创建序列化器字段
【发布时间】:2021-10-11 22:26:41
【问题描述】:

我正在为 Auth 编写一个 api。当他们注册时,我有 2 种用户类型( Donors , Charity ),我的数据正在发生变化。所以我需要根据数据更新我的字段。

这是我到目前为止所做的。

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()

在 views.py 中,我尝试从外部 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 = [] 定义为一个空列表,这就是字段为空且不保存任何用户数据的原因。

顺便说一句,我开始学习 django rest。我是这个框架的新手,所以我对任何错误的定义等感到抱歉。

那么有什么想法可以根据数据创建字段吗?提前致谢。祝你有美好的一天。

【问题讨论】:

  • 检查this。您可能会发现它很有帮助
  • 它真的很有帮助。感谢您的评论,我怎么没看到这个文档。例子。

标签: python django django-rest-framework rest


【解决方案1】:

最好的解决方案是拥有 2 个单独的序列化器:

  • 制作 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()

拥有 2 个单独的序列化器将使代码更简洁,更易于理解和维护

【讨论】:

  • 我认为在这种情况下,我们需要创建 2 个差异。序列化器,是的,为了编写更清晰的代码,我们应该使用这种方式。谢谢你的答案。我会把它标记为正确答案
猜你喜欢
  • 2017-03-04
  • 2014-11-20
  • 1970-01-01
  • 2015-12-26
  • 2020-09-29
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多