django中的无符号整数字段

时间:2013-09-20 20:58:27

标签: django django-forms unsigned django-models

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

3 个答案:

答案 0 :(得分:6)

据我所知,Django中唯一的无符号整数字段是PositiveIntergerField和PositiveSmallIntegerField,它们对你来说都太小了。您可能需要查看自定义字段才能获得所需内容。该文档为here。编写自定义字段时,有一件事非常有用,就是查看官方django模型字段之一的代码。它们都可以在`django / db / models / fields / init .py

找到

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

答案 1 :(得分:3)

在创建自定义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,
        })

答案 2 :(得分:0)

从Django 2.2开始,存在有关如何创建自定义字段的官方文档。最好的部分是,现在他们有一个在here右边创建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'

希望这会有所帮助。