Django之Model类

1、model

用来和数据交互的(读取和传入数据)

 2、orm

Object Relational Mapping对象关系映射,python中的model对象和数据库中的表做映射

3、重要概念

3.1、类-表对应

model中的一个类对应数据库中的一个表。实现方式:继承Model类(django.db.models.Model)

3.2、属性-字段

类中的属性对应数据库中的字段

3.2.1、类型

CharField   字符类型

IntegerField  数值类型,choise枚举类型数据,元祖包元祖

type = models.IntegerField(choices=((1,‘机构‘),(2,‘课程‘),(3,‘讲师‘)),verbose_name="类别")

BooleanField   布尔类型

NullBooleanField  可以为空的布尔值

AutoField    int自增列,必须填入参数 primary_key=True,auto_create,自动创建,mysql的auto_increment

FloatField   浮点型

DecimalField  同Python的Decimal类型,参数:max_digits 最大总位数,decimal_places 小数点后的位数

TextField   文本类型

UUIDField   字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

# 模型类
class Order(models.Model):
    no = models.UUIDField(verbose_name=‘订单编号‘)
    price = models.DecimalField(verbose_name=‘订单金额‘,max_digits=6, decimal_places=2)
    pay_state = models.BooleanField(default=False)

# 创建对象
import uuid
Order.objects.create(no=uuid.uuid4(),price=1819.567,pay_state=True)   # price只保留两位小数,会自动四舍五入

FileField   文件,字符串,路径会保存到数据库,文件上传到指定目录

参数:upload_to = ""  上传文件的保存路径,storage = None  存储组件,默认django.core.files.storage.FileSystemStorage

ImageField   图片,路径保存到数据库,文件上传到指定目录

参数:upload_to = ""      上传文件的保存路径

     storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

   width_field=None,   上传图片的高度保存的数据库字段名(字符串)

   height_field=None   上传图片的宽度保存的数据库字段名(字符串)

DateField   日期类型,格式:格式:YYYY-MM-DD

参数:auto_now 每次保存时,自动设置当前字段为当前时间,用于最后一次修改

     auto_now_add  每一次保存时,自动设置为当前时间,用于“创建时间”

注意:auto_now和auto_now_add及default只能设置一个,不能组合

DateTimeField   日期时间类型  datetime.datetime,日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

TimeField   时间类型, 格式: HH:MM[:ss[.uuuuuu]]

3.2.2、约束

max_length   最大长度

default   默认值

unique  唯一值

primary_key  主键

null  

blank  是否允许输入为空,即输入空字符串

db_index  索引

db_column  指定字段名

verbose_name 在admin显示字段名称

choices  一个包含多元素元组的可迭代的对象,用于给字段提供选项

3.2.3、关系

ForeignKey  一对多,将字段定义在多端,自动在多端中添加一个外键,如:store = ForeginKey(Store, db_column="外键的列名"),外键字段: store_id

OneToOneField  一对一,将字段定义在任意一端

ManyToManyField   多对多,将字段定义在两端

4、元信息

在Model的子类中定义Meta来声明表的相关信息

# 需要定义在类的内部
class Meta:
    app_label=‘‘   # 应用名
    db_table=‘‘    # 表名
    ordering = []   # 排序字段,字段名前可使用‘-‘表示倒序
    verbose_name = ‘‘   # admin中所显示的名称
    unique_together= ‘‘  # 来设置的不重复的字段组合

5、CRUD

5.1、增

5.1.1、通过模型类对象管理器插入记录

语法:模型类名.objects.create(类属性=值)  此方式是直接操作数据库

stu1 = Student.objects.create(name=‘Negan‘,sex=‘m‘,score=95.0)

5.1.2、实例化模型对象插入数据

car = Car(name="宝马3",price=20.5)
car.save()
car = Car()
car.name="宝马5i"
car.price=50.5
car.save()

通过对象模型进行插入操作是在内存中执行的,也就是说在没有save()之前都是在内存中操作,和数据库没有关系,只有在save()后,才将数据加载到数据库

5.2、查

5.2.1过滤器

filter  选出符合条件的数据,可以包含多个字段,用“,”隔开表示与的关系

s1 = Student.objects.filter(sex=‘m‘,name=‘Neagn‘)

# 支持链式调用
s1 = Student.objects.filter(sex=‘m‘).filter(name=‘Negan‘)

exclude  去掉符合条件的

s1 = Student.objects.filter(sex=‘m‘).exclude(socre=72)  # 找出性别为m以及分数不是72的

5.2.2条件

语法:属性名__运算符=临界值

gt  大于  

Car.objects.filter(price__gt=30)

lt  小于

gte  大于等于

lte   小于等于

exact   精确内容查找,区分大小写

iexact    i 代表ignore(忽略),即忽略大小写

contains   内容包含,相当于模糊查询

Car.objects.filter(name__contains=‘奔‘)

startswith    以...开头

endswith    以..结尾

istartswith    以...开头,忽略大小写

endswith   以..结尾,忽略大小写

icontains   包含xx字符,忽略大小写

in  包含值项 

Car.objects.filter(price__in=(30.58,26.65))

isnull    为null

isnotnull   非null

5.2.3、获取对象