django中的无符号整数字段

django中的无符号整数字段,django,django-forms,unsigned,django-models,Django,Django Forms,Unsigned,Django Models,知道如何在Django中使用无符号整数字段吗?我的意思是模型中的一个字段,范围从0到4294967295,存储32位。此定义不包括PositiveIntegerField,因为它的范围仅为0到2147483647。我也不喜欢使用大整型字段,因为那样会浪费大量内存。据我所知,Django中唯一的无符号整型字段是PositiveIntegerField和PositiveSmallIntegerField,这两个字段对您来说都太小了。您可能需要查看自定义字段才能获得所需的内容。这方面的文件是。在编写自

知道如何在Django中使用无符号整数字段吗?我的意思是模型中的一个字段,范围从0到4294967295,存储32位。此定义不包括
PositiveIntegerField
,因为它的范围仅为0到2147483647。我也不喜欢使用大整型字段,因为那样会浪费大量内存。

据我所知,Django中唯一的无符号整型字段是
PositiveIntegerField
PositiveSmallIntegerField
,这两个字段对您来说都太小了。您可能需要查看自定义字段才能获得所需的内容。这方面的文件是。在编写自定义字段时,一件真正有用的事情是查看一个官方django模型字段的代码。它们都可以在
django/db/models/fields/\uuuu init\uuuuu.py


我会发布一些代码,但我没有足够的自定义字段经验来确信它将是您所需要的。祝你好运`

尝试创建自定义
UnsignedIntegerField
。仅手动测试插入无符号32位整数

from django.core import validators
from django.db import models
from django.utils.functional import cached_property


class UnsignedIntegerField(models.IntegerField):

    MAX_INT = 4294967295

    @cached_property
    def validators(self):
        # These validators can't be added at field initialization time since
        # they're based on values retrieved from `connection`.
        validators_ = [*self.default_validators, *self._validators]
        min_value, max_value = 0, self.MAX_INT
        if (min_value is not None and not
            any(isinstance(validator, validators.MinValueValidator) and
                validator.limit_value >= min_value for validator in validators_)):
            validators_.append(validators.MinValueValidator(min_value))
        if (max_value is not None and not
            any(isinstance(validator, validators.MaxValueValidator) and
                validator.limit_value <= max_value for validator in validators_)):
            validators_.append(validators.MaxValueValidator(max_value))
        return validators_

    def db_type(self, connection):
        return "INTEGER UNSIGNED"

    def get_internal_type(self):
        return "UnsignedIntegerField"

    def formfield(self, **kwargs):
        return super().formfield(**{
            'min_value': 0,
            'max_value': self.MAX_INT,
            **kwargs,
        })
来自django.core导入验证程序的

从django.db导入模型
从django.utils.functional导入缓存的\u属性
类UnsignedIntegerField(models.IntegerField):
最大值=4294967295
@缓存的不动产
def验证器(自身):
#无法在字段初始化时添加这些验证器,因为
#它们基于从“连接”检索到的值。
验证器\=[*self.default\u验证器,*self.\u验证器]
最小值,最大值=0,self.max\u INT
如果(最小值)不是无且不是
任何(isinstance(validator,validators.MinValueValidator)和
validator.limit_value>=验证器中验证器的最小值(U)):
validators.append(validators.MinValueValidator(minu值))
if(max_)值不是None和not
任何(isinstance(validator、validators.MaxValueValidator)和

validator.limit_value从Django 2.2开始,有关于如何创建自定义字段的官方文档。最好的部分是,现在他们有了一个创建
UnsignedAutoField
的示例。对于我使用Django 2.0的用例,这个片段就足够了

from django.db.models.fields import AutoField

class UnsignedAutoField(AutoField):
    def db_type(self, connection):
        return 'integer UNSIGNED AUTO_INCREMENT'

    def rel_db_type(self, connection):
        return 'integer UNSIGNED'
希望这有帮助