Can the Django ORM store an unsigned 64-bit integer (aka ulong64 or uint64) in a reliably backend-agnostic manner?

后端 未结 1 813
[愿得一人]
[愿得一人] 2021-02-02 07:50

All the docs I\'ve seen imply that you might be able to do that, but there isn\'t anything official w/r/t ulong64/uint64 fields. There are a few off-the-shelf options t

相关标签:
1条回答
  • 2021-02-02 08:06

    Although I did not test it, but you may wish to just subclass BigIntegerField. The original BigIntegerField looks like that (source here):

    class BigIntegerField(IntegerField):
        empty_strings_allowed = False
        description = _("Big (8 byte) integer")
        MAX_BIGINT = 9223372036854775807
    
        def get_internal_type(self):
            return "BigIntegerField"
    
        def formfield(self, **kwargs):
            defaults = {'min_value': -BigIntegerField.MAX_BIGINT - 1,
                        'max_value': BigIntegerField.MAX_BIGINT}
            defaults.update(kwargs)
            return super(BigIntegerField, self).formfield(**defaults)
    

    Derived PositiveBigIntegerField may looks like this:

    class PositiveBigIntegerField(BigIntegerField):
        empty_strings_allowed = False
        description = _("Big (8 byte) positive integer")
    
        def db_type(self, connection):
            """
            Returns MySQL-specific column data type. Make additional checks
            to support other backends.
            """
            return 'bigint UNSIGNED'
    
        def formfield(self, **kwargs):
            defaults = {'min_value': 0,
                        'max_value': BigIntegerField.MAX_BIGINT * 2 - 1}
            defaults.update(kwargs)
            return super(PositiveBigIntegerField, self).formfield(**defaults)
    

    Although you should test it thoroughly, before using it. If you do, please share the results :)

    EDIT:

    I missed one thing - internal database representation. This is based on value returned by get_internal_type() and the definition of the column type is stored eg. here in case of MySQL backend and determined here. It looks like overwriting db_type() will give you control over how the field is represented in the database. However, you will need to find a way to return DBMS-specific value in db_type() by checking connection argument.

    0 讨论(0)
提交回复
热议问题