知道如何在 Django中使用无符号整数字段吗?我的意思是模型内的一个字段,范围从 0 到 4294967295 并存储 32 位。这个定义不包括 ,PositiveIntegerField
因为它只有 0 到 2147483647 的范围。我也不喜欢使用 a bigIntegerField
,因为那会浪费大量内存。
问问题
9632 次
3 回答
9
据我所知,Django 中唯一的无符号整数字段是PositiveIntegerField
和PositiveSmallIntegerField
对你来说都太小了。您可能必须查看自定义字段才能获得所需的内容。文档在这里。编写自定义字段时真正有用的一件事是查看官方 django 模型字段之一的代码。它们都可以在django/db/models/fields/__init__.py
我会发布一些代码,但我没有足够的自定义字段经验来确信它会是你需要的。祝你好运!`
于 2013-09-21T04:37:37.883 回答
4
尝试创建自定义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,
})
于 2018-08-14T18:31:24.153 回答
3
从 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'
希望这可以帮助。
于 2019-05-25T15:34:23.153 回答