【问题标题】:make length in integerfield django model在整数字段 django 模型中制作长度
【发布时间】:2020-08-14 00:41:13
【问题描述】:

我的 model.py 是:

from django.core.validators import MinLengthValidator,MaxLengthValidator

    class clients(models.Model):
        client_identity_id = models.IntegerField(validators=[MaxLengthValidator(11),MinLengthValidator(11)], unique=True)

        '
        '

我的 serializers.py 是:

class UserSerializer(serializers.ModelSerializer):
    #money = serializers.IntegerField(required=False)
    class Meta:
        model = clients
        fields = ('client_identity_id','client_id','client_firstname','client_middlename','client_lastname','client_country','money','client_num')
        read_only_fields = ('money','client_id')
    def create(self, validated_data, **kwargs):
        validated_data['client_id'] = ''.join(secrets.choice(string.ascii_uppercase + string.digits) 
                                              for i in range(8))

        return clients.objects.create(**validated_data)

我的views.py是:

def post(self,request):
    data=request.data
    serializer = UserSerializer(data=data)
    if serializer.is_valid():

        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

但是当我使用 client_identity_id=12345678910 发出发布请求时,它一直告诉我“'int' 类型的对象没有 len()” 请问我该如何解决?

【问题讨论】:

    标签: python django


    【解决方案1】:

    11 位数字的范围在 10000000000 和 99999999999 之间,因此您可以使用:

    from django.core.validators import MinValueValidator, MaxValueValidator
    
    class clients(models.Model):
            client_identity_id = models.IntegerField(
                validators=[
                    MinValueValidator(10_000_000_000),
                    MaxValueValidator(99_999_999_999)
                ],
                unique=True
            )

    【讨论】:

    • 它是 MinValueValidator,MaxLengthValidator 不是 MinValidator, MaxValidator,我试过了,同样的错误“'int' 类型的对象没有 len()”
    【解决方案2】:

    您收到的错误是 python 错误。整数不是 python 中的可迭代对象。我假设您的验证器依赖于仅适用于可迭代对象(字符串、列表等)的 len() 方法。我建议您将字段更改为 CharField() 或创建自定义验证器来检查整数的科学记数法值.例子。像 10000000000 这样的 11 个字符将是 1 x 10^11。提示这里的指数是 11。我希望这会有所帮助!

    【讨论】:

    • 我把它做成了charfield,它工作得很好,谢谢! ,有什么想法可以让它以“01”之类的特定数字开头吗?
    • 谷歌搜索“prepend python string”有很多方法可以做到这一点。如果您想将 01 添加到每个 client_identity_id 将 11 char 条目转换为 13 char 条目,请重写 def save() 方法。在调用 super(...).save() 之前,将“01”添加到 self.client_identity_field。这是覆盖保存stackoverflow.com/questions/4269605/…的链接
    • 不,我不是那个意思,我希望模型只接受以“01”开头的client_identity_id
    • 我可能会在 save 方法中编写一个自定义验证器。 docs.djangoproject.com/en/3.0/ref/validators。由于字符串是可迭代的,您可以在 client_identity_key[0:1] == “01” 上进行验证
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2018-11-28
    • 2012-03-02
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多