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