Django‘模型类的字段类型介绍

新建模型类

  • 继承django.db.models.Model,如下所示:
    from django.db import models

    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)


 

字段类型

AutoField:

  • 自增序列,如果没有指定主键,django默认自增序列ID为主键列
  • 显式的方式设置主键列,如下:
    id = models.AutoField(primary_key=True)

UUIDField:

  • uuid类型,具有全局唯一性,可作为主键
  • 设置uuid为主键的代码示例:
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 重复的概率极低,比买彩票中头奖的概率还低,在没重复之前已经受到Django性能制约了。

文本类型

CharField:字符串

  • 定义一个名称为名称的可为空并且最大长度为128字符的字符字段。
    name = models.CharField(max_length=128,verbose_name='名称',null=True,blank=True)

choices多样式设置

IntegerField类型 设置choices属性 (常用)

sta_choices = (
    (0, '待支付'),
    (1, '已支付'),
    (2, '已取消'),
)

class OpenVip(models.Model):
    status = models.IntegerField("订单状态  0 待支付  1已支付  2 已取消",                                     
                                          choices=sta_choices, default=0)

SmallIntegerField类型 设置choices属性        使用 obj.get_字段名_display() 展示

    PAY_STATUS = (
        (1, '待支付'),
        (2, '待发货'),
        (3, '待收货'),
        (4, '待评价'),
        (5, '已完成'),
    )

# 1-待支付,2-待发货,3-待收货,4-待评价,5-已完成
    status = models.SmallIntegerField(default=1, choices=PAY_STATUS, verbose_name="订单状态")


# 视图语法
       d = {    
         'status': i.get_status_display(),
            }


# 注意:obj指单条数据的对象

# obj.get_字段名_display()    

CharField类型 设置choices属性

    class BusinessInfo(models.Model):
        line_status = models.CharField(max_length=128,null=True,blank=True,help_text='line_status_choices',verbose_name='线路状态')
        
        choices_dict = {
            'line_status':'line_status_choices',
        }
        
        def __init__(self,*args,**kwargs):
            super(BusinessInfo,self).__init__(*args,**kwargs)
            for field,group_key in self.choies_dict.items():
                
                # get_dict_group_by_key 返回值形如:asset_type_choices
                self._meta.get_field(field).choices = get_dict_group_by_key(group_key) 
               

2、TextField:大文本类型

  • 例一:
    description = models.TextField(null=True,blank=True,verbose_name='描述')

布尔值

BooleanField与NullBooleanField

  • BooleanField:bool值。
  • NullBooleanField:可为空的bool值,如果表已经建好,需要添加一个bool值得字段,那么只能用这种方式。
    lock = models.BooleanField(default=False,verbose_name='是否锁定')
    
    is_mount = models.NullBooleanField(default=False,verbose_name='是否挂载',null=True,blank=True)
    

日期与时间

1、DateField:日期类型,精确到年月日 格式:"%Y-%m-%d"

    buy_date = models.DateField(null=True,black=True,verbose_name='购买日期')

2、DateTimeField:时间类型是,精确到时分秒 格式::"%Y-%m-%d %H:%M:%S"

    create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间',null=True,blank=True)
    update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间',null=True,blank=True)
    create_time = models.DateTimeField("创建时间", auto_now_add=True, editable=True, null=True)
    update_time = models.DateTimeField("更新时间", auto_now=True, editable=True, null=True)

1、null:标识是否可以为空,默认是为False。在使用字符串相关的Field(CharField/TextField/URLField/EmailField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,由于BooleanField不接受null参数,因此你如果想要设置这个字段可以为空的bool类型,那么对应的可空的bool类型字段则为NullBooleanField。

2、blank:标识这个字段在表单验证的时候是否可以为空,默认是False。这个和null是有区别的,null是一个纯数据库级别的。而blank是表单验证级别的。

数字类型 (数字类型验证表单不声明null=True,blank=True, 必须要传)

1、IntergerField:整数

    order = models.IntegerField(default=1000,verbose_name='序列号',null=True,blank=True)

2、FloatField:浮点数

    rate = models.FloatField(null=True,blank=True,verbose_name='速率')

3、DecimalField:精确数字

    price = models.DecimalField(verbose_name='合同金额',max_digits=8,decimal_places=2,null=True,blank=True,)
    # 最长8位,小数位数2位。

文件

1、FileField:文件类型

2、FilePathField:文件路径类型

3、ImageField:图像类型,自动校验是否为图片格式

IP地址

1、GenericIPAddressField:IP类型,支持IPV4和IPV6

  • 入库时,Django会校验是否为IP地址格式。
    node = models.GenericIPAddressField(verbose_name='管理地址',unique=True,null=True,blank=True)

ForeignKey:外键

1、普通外键

  • 第一个参数:外键表
  • related_name: 外键表实例中子表的列表的名称 如:contract1.assets
  • on_delete: 值为models.CASCADE时,当删除父表记录时,子表级联删除
    contract = models.ForeignKey('Contract',related_name='assets',verbose_name='所属合同',on_delete=models.CASCADE,null=True,blank=True)
    
    # 如果外键表不在同一个应用中
    use_org = models.ForeignKey('user_manager.Organization',related_name='assets',verbose_name='使用机构',on_delete=models.CASCADE)
    

2、自关联

  • 注意事项:入库的时候需要注意入库顺序,父在前,子在后。
    mount_dev = models.ForeignKey('self',related_name='assets',verbose_name='挂在设备',on_delete=models.CASCADE,null=True,blank=True)

ManyToManyField:多对多

    class Role(models.Model):
        name = models.CharField(max_length=50,blank=True,null=True,verbose_name='角色')
    
    class UserProfile(models.Model):
        roles = models.ManyToManyField(Role)
      
    
    user = UserProfile.objects.all().first()
    user.roles # 当前用户拥有的角色,是一个查询集(QuerySet)
    

OneToOneField:一对一

    from django.conf import settings
    from django.db import models
    from django.contrib.auth.mdoels import User

    class MySpecialUser(models.Model):
        user = models.OneToOneField( settings.AUTH_USER_MODEL,on_delete=models.CASCADE, )
        supervisor = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='supervisor_of',)
        user1 = OneToOneField(User,on_delete=models.CASCADE)
        

字段类型参数

null:数据库中是否可为空。
blank:后台管理界面是否检验必填项。
choices: 键值选项。
db_column: 数据库对应列明,默认为属性名。
db_index:如果为True,将在此列建立数据库索引。
default:默认值。
help_text:帮助文档,可用于自定义choices。
primary_key:是否主键。
unique:唯一性。
verbose_name:显示名称
auto_now_add:针对时间类型,创建时赋值为当前时间。
auto_now:针对时间类型,每次修改时赋值为当前时间。

元选项(Meta)

    class User(AbstractUser):
    '''用户模型类'''

    class Meta:
        abstract = True # 虚拟表,不会创建实体表 
        db_table = 'df_user' # 设置数据中的表名
        verbose_name = '用户'  
        verbose_name_plural = verbose_name
        ordering = ['ordering'] # 查询集默认排序列
        unique_together = ('series','name') # 多列组合唯一性。


                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值