【问题标题】:How to override model field validation in django rest framework ModelSerializer如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证
【发布时间】:2014-05-03 06:30:29
【问题描述】:

我有以下型号:

class UserProfile(models.Model):
    mobileNumber = models.BigIntegerField(primary_key=True)
    authKey = models.CharField(max_length=300,null=False,blank=False)
    creationDateTime = models.DateTimeField(auto_now_add=True)
    lastUpdateDateTime = models.DateTimeField(auto_now=True)

序列化器:

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('mobileNumber','authKey')

如果用户配置文件模型已经有一个手机号码 XX44,并且如果我尝试使用带有 json {'mobileNumber': XX44, 'authKey': u'ggsdsagldaslhdkjashdjkashdjkahsdkjah'} 的 UserProfileSerializer 进行序列化,我会收到以下错误:

{'mobileNumber': [u'User profile with this MobileNumber already exists.']}

因为正在为序列化器字段运行模型验证。

如何停止执行 mobileNumber 的模型字段验证。我在序列化程序中尝试了 validate 和 validate_mobileNumber 方法,但它们仍在执行模型验证。

【问题讨论】:

  • 你要序列化的数据 {'mobileNumber':XX44.....} 是随机数据还是UserProfile模型的数据?因为如果是随机的未经验证的数据,那么你不应该使用模型序列化器来序列化它,只需使用普通的序列化器。
  • 尝试从 UserProfile 模型中删除 'primary_key=True'。

标签: django django-models django-rest-framework django-forms django-validation


【解决方案1】:

移除对表的手机号的唯一约束,因此django序列化器将根据该约束进行验证。

或 或者,

   serializer=UserProfileSerializer(data=request.DATA,partial=True)

【讨论】:

    【解决方案2】:

    我了解您不会保存序列化程序数据。因此,您可以在UserProfileSerializer 上将mobileNumber 设置为read_only 字段。

    查看序列化器字段文档以获取更多信息:http://www.django-rest-framework.org/api-guide/fields/#core-arguments

    【讨论】:

      【解决方案3】:

      通过覆盖序列化程序中的模型字段,并指定required=False, allow_blank=True, allow_null=True

      class SomeModel(models.Model):
         some_model_field_which_is_required = models.ForeignKey(...)
         some_other_required_field = models.CharField(...)
      
      class SomeModelSerializer(serializers.ModelSerializer):
          some_model_field_which_is_required = SomeNestedSerializer(
              many=True, required=False, allow_blank=True
          )
          some_other_required_field = serializers.CharField(required=False, allow_blank=True)
      
         def validate(self, *args, **kwargs):
             print('should get here')
      
         def validate_some_other_required_field(self, *args, **kwargs):
             print('should also get here')
      
          class Meta:
              model = SomeModel
      
      

      【讨论】:

        猜你喜欢
        • 2017-06-15
        • 2013-12-22
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        相关资源
        最近更新 更多