【问题标题】:unsigned integer field in djangodjango中的无符号整数字段
【发布时间】:2013-09-26 08:56:24
【问题描述】:

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

【问题讨论】:

    标签: django django-forms unsigned django-models


    【解决方案1】:

    据我所知,Django 中唯一的无符号整数字段是PositiveIntegerField 和PositiveSmallIntegerField,它们对你来说都太小了。您可能必须查看自定义字段才能获得所需的内容。相关文档是here。编写自定义字段时真正有用的一件事是查看官方 django 模型字段之一的代码。他们都可以在django/db/models/fields/__init__.py找到。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        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-03-30
          • 1970-01-01
          • 2013-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 2013-10-02
          相关资源
          最近更新 更多