新建模型类
- 继承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') # 多列组合唯一性。