Skip to content

Instantly share code, notes, and snippets.

@pinfort
Last active July 4, 2019 05:39
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save pinfort/8d3433d304b105909ed4da73e366eee3 to your computer and use it in GitHub Desktop.
Save pinfort/8d3433d304b105909ed4da73e366eee3 to your computer and use it in GitHub Desktop.
Django database fields for using unsigned bigint column
from django.db import models
class PositiveBigIntergerRelDbTypeMixin(models.PositiveIntegerRelDbTypeMixin):
def rel_db_type(self, connection):
if connection.features.related_fields_match_type:
return self.db_type(connection)
else:
return models.BigIntegerField().db_type(connection=connection)
class PositiveBigIntegerField(PositiveBigIntegerRelDbTypeMixin, models.BigIntegerField):
description = _("Positive big integer")
def get_internal_type(self):
return "PositiveBigIntegerField"
def formfield(self, **kwargs):
defaults = {'min_value': 0}
defaults.update(kwargs)
return super().formfield(**defaults)
def db_type(self, connection):
# get db vendor ex.mysql, postgresql, sqlite...
db_vendor = connection.vendor
if db_vendor == "mysql":
return "bigint UNSIGNED"
elif db_vendor == "oracle":
return "NUMBER(20)"
elif db_vendor == "postgresql":
# postgresql is not supported 'unsigned'
return "bigint"
elif db_vendor == "sqlite":
return "bigint unsigned"
else:
# if db_vendor is unknown(BaseDatabaseWrapper), we should return None
return None
@pinfort
Copy link
Author

pinfort commented Nov 14, 2017

このままだとget_internal_type()がエラーになってしまうのでやっぱりdb_type()関数も書かないといけないね

@pinfort
Copy link
Author

pinfort commented Nov 14, 2017

db_type()追加してみました

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment