Django模型自定义没有的数据库字段类型
Django模型自定义没有的数据库字段类型
目的: 为了节省数据库,避免造成空间浪费,也是优化数据库的一种形式。
from django.db import models
# 创建定长的字段类型
class MyCharField(models.Field):
def __init__(self, *args, **kwargs):
self.max_length = kwargs["max_length"]
super().__init__(*args, **kwargs)
# 这个方法是创建Django中,没有的数据库字段类型
def db_type(self, connection):
return f"char({self.max_length})"
# 创建Tinyint的字段类型
class MyTinyInt(models.Field):
def db_type(self, connection):
return 'tinyint'
# 创建Smallint的字段类型
class MySmallInt(models.Field):
def db_type(self, connection):
return 'smallint'
# Create your models here.
class UserInfo(models.Model):
SEX = (
('male', '男'),
('female', '女')
)
phone = MyCharField(max_length=11, verbose_name="手机号", unique=True)
nickname = models.CharField(max_length=20, verbose_name="昵称")
sex = models.CharField(max_length=10, choices=SEX, default='male', verbose_name="性别")
birth_year = MySmallInt(default=2002, verbose_name="出生年")
birth_month = MyTinyInt(default=1, verbose_name='月')
birth_day = MyTinyInt(default=1, verbose_name='日')
avatar = models.CharField(max_length=100, default='', verbose_name='头像')
location = models.CharField(max_length=20, default='', verbose_name='居住地')
class Meta:
db_table = 'sp_user'
@property
def profile(self):
# 判断属性是否存在
if not hasattr(self, 'obj'):
self.obj, _ = Profile.objects.get_or_create(id=self.id)
return self.obj
class Profile(models.Model):
SEX = (
("male", "男"),
("female", "女")
)
location = models.CharField(max_length=10, default="", verbose_name="城市")
min_distance = models.IntegerField(default=1, verbose_name='最小距离')
max_distance = models.IntegerField(default=100, verbose_name='最大距离')
min_dating_age = MyTinyInt(default=18, verbose_name="最小年龄")
max_dating_age = MyTinyInt(default=60, verbose_name="最大年龄")
dating_sex = models.CharField(max_length=10, choices=SEX, default="male", verbose_name="性别")
class Meta:
db_table = "sp_profile"
其中:MyCharField 对应数据库的char类型
MyTinyInt 对应数据库的tinyint类型
MySmallInt 对应数据库的是smallInt类型
SEX = (
('male', '男'),
('female', '女')
)
SEX 是一种枚举,选择数据。
hasattr(self,'obj') 的作用是:判断属性是否存在
浙公网安备 33010602011771号