新建模型类
继承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性能制约了。
文本类型
1、CharField:字符串
例一:定义一个名称为名称的可为空并且最大长度为128字符的字符字段。
name = models.CharField(max_length=128,verbose_name='名称',null=True,blank=True)
asset_type_choices = (
('1', '交换机'),
('2', '路由器'),
('3', '风扇')
)
asset_type = models.CharField(choices=asset_type_choices,max_length=128,verbose_name='类型',null=True,blank=True)
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)
数字类型
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='合同金额',null=True,blank=True,max_digits=8,decimal_places=2)
# 最长8位,小数位数2位。
文件
1、FileField:文件类型
2、FilePathField:文件路径类型
3、ImageField:图像类型,自动校验是否为图片格式
IP地址
1、GenericIPAddressField:IP类型,支持IPV4和IPV6
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') # 多列组合唯一性。