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') 的作用是:判断属性是否存在

posted @ 2020-09-21 22:51  zeeyan  阅读(415)  评论(0)    收藏  举报