【问题标题】:Why extra_kwargs is used if it can be replaced?如果可以替换,为什么要使用 extra_kwargs?
【发布时间】:2021-08-02 09:26:54
【问题描述】:

我正在使用 django-rest-framework 编写一个项目,并且在使用序列化程序时,我意识到 extra_kwargs 中的大多数关键字,如“required、read_only、write_only 等”。可以用 read_only_fields、write_only_fields、序列化器字段中的“required”等替代。extra_kwargs 是否有一些独特的功能?

【问题讨论】:

  • 您不需要指定字段的类型,因为这是由模型决定的。您通常希望避免指定字段的类型,因为以后可能会在建模中更改字段的类型。

标签: django django-rest-framework


【解决方案1】:

当您在kwargs 中设置read_onlywrite_only 等时,您将它们指定到模型的字段中(它将具有模型字段验证以及您的验证) p>

但是当您覆盖序列化程序中的字段时,它将不再具有模型字段验证(例如唯一、唯一一起等)

【讨论】:

    【解决方案2】:

    documentation on extra_kwargs [drf-doc] 部分回答了这个问题:

    请记住,如果 字段已在序列化程序类上显式声明,则 extra_kwargs 选项将被忽略。

    如果您因此不指定extra_kwargs中的项目,则需要指定字段本身,例如:

    class MyUserSerializer(serializers.ModelSerializer):
        password = serializer.CharField(write_only=True)

    但是假设您后来改变了主意,并且想要使用 IntegerField 作为密码,那么您不仅需要更改模型字段,还需要更改使用该密码的序列化器字段.那么MyUserSerializer 看起来像:

    class MyUserSerializer(serializers.ModelSerializer):
        password = serializer.IntegerField(write_only=True)

    通过使用extra_kwargs,您无需指定字段本身,您可以简单地将带有extra_kwargs 的参数“注入”到该字段中。

    【讨论】:

      【解决方案3】:

      您可以对 extra_kwargs 使用验证器:

      'email': {
                  'validators': [
                      UniqueValidator(
                          queryset=User.objects.all()
                      )
                  ]
              }
      

      【讨论】:

        猜你喜欢
        • 2012-08-03
        • 2016-08-09
        • 2010-12-26
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        相关资源
        最近更新 更多