常见的模型字段
AutoField:自增字段
BooleanField:布尔类型
TimeField:时间类型 显示的是时分秒
DateField:日期类型
DateTimeField:日期时间类型
CharField:字符类型
EmaiField:字符类型,用于存储有格式的字符串
UrlField:字符类型,储存有格式的路由字符串
FileField:储存文件路径
ImageFild:用于储存图片路径
FilePathField:从特定的文件路径选取某个文件
FloadField:浮点型
IntegerField:整型
TextField:长文本型
常见的字段设置相应的参数
verbose_name:在admin站点管理中设置指端的显示名称
primary_key:主键
max_length:字段的最大长度
unique:设置是否唯一字段属性
blank:与null一起联合使用,如果字段为空,在数据库中就存储的值就null
default:设置默认值
choices:为字段设置可选择的值
help_text:设置表单的提示信息
error_messages:设置错误提示
serialize:设置该字段可以序列化
特殊字段参数:
auto_now:用于设置时间类型的字段时,无论是你添加还是修改对象,时间为你添加或者修改的时间
upload_to:ImageField和FileField的upload_to选项是必填项,其存储路径是相对于MEIDA_ROOT而来的。
外键字段常见参数
to 关联的模型名称
on_delete 必选,就是删除模式,其中包括一下几种
CASCADE
PROTECT
SET_NULL
SET
DO_NOTHING
related_name 关联查询
to_field 用于外键的关联性,默认值时主键
db_table 多对多中用于生成第三张表的名称
在写__str__时要注意一般时模型名+主键,注意,返回值必须时字符类型的字段.
Mete中常见的属性
abstract:如果设置为True,说明这是抽象模型,就不会在数据库中建立相应的表,我们一般把共同字段写入抽象模型类中,然后让其他类去继承他,这样就可以有他的字段了
db_table:设置模型对应的数据表的名称
get_lastst_by: 设置模型数据的排列方式
managed:如果设置为False,说明不支持数据迁移
ordering:属性值为一个列表,将模型数据,以某个字段进行排序
verbose_name:设置模型的名称,以复数表示,在admin中经常设置
verbose_name_plus:去掉复数
数据迁移
python manage.py makemigrations 执行该命令后就会在每个应用下的migrations常见0001_initial.py文件,这个文件时一个脚本代码,当我们执行python manage.py migrate后脚本代码就会在脚本文件的数据库创建相应的数据表,在我们修改字段后在执行命令也会先生成脚本文件,然后在生成表单
新增模型字段必须将属性null或者blank设置为True或者设置默认值
migrate命令执行某一个.py文件,只需要在后面加上app名称+相应的py脚本文件
可以通过sqlmigrate命令+app名称+.py脚本文件,就能将起转换成sql语句
数据的导入与导出功能
导出:python manage.py dumpdata>data.json 把数据导出到data.json文件中去
导入:python manage.py loaddata data.json
数据表的操作
增:
第一种:先实例化对象,为对象属性赋值,然后save()储存
user = user()
user.name = '孙悟空'
user.age = 18
user.save()
第二种:实例化时候直接赋值然后save()
user = user(age=18,name='孙悟空')
user.save()
第三种:create方法
user.objects.create(age=18,name='孙悟空')
第四种字典:dic = {'age':18','name':'孙悟空'}
user.objects.create(**dic)
常见的一些方法
get_or_create():没有重复的数据就会插入,否则返回在相同数据的数据对象
update_or_create():查早相应的数据如果有就更新,没有就会去创建
bulk_create(),用于批量插入,将数据对象以列表或者元组的数据传给bulk_create()
修:
第一种,获取要修改数据的对象,设置相应的值,save()重新保存
第二种,先获取相应的对象,然后update(),可以传参数,或者字典
第三种,直接user.object.upadate(age=16),直接对表中的所有的数据进行修改
使用内置方法F实现数据的自增自减:user.objects.filter(name='孙悟空').upadate(age = F('age')+1)
批量更新:bulk_update()
删:
删除所有数据:user.objects.all().delect()
删除一行:user.objects.get('name'='孙悟空').delect()
删除多行:user.objects.filter(name='孙悟空').delect()
删除时,如果设置有外键,就会同时删除外键关联的消息
查:
user.objects.all()
user.objects.filter(....) 没有查询到返回一个空列表
user.objects.get() 没有查询到会报错
user.objects.values('name') 查询的结果以列表形式返回,列表元素以字典形式表示
user.objects.values_list('name') 查询结果以列表形式返回,但是元素元组表示
user.objects.filter(Q(name='孙悟空')|Q(age = '16')) 相当于sql里面的or查询
user.objects.filter(~Q(name='孙悟空')) Q前面加上~就是不等于查询
user.objects.exclude(name='孙悟空') exclude也是不等于
user.objects.fifter(name='孙悟空').count() count用来计算查找的数据量
user.objects.fifter(age='18').order_by('id') order_by降序排列,加上"-"就是升序
user.objects.values('name').annotate(Sum('id')) 如果不用values,就会按照主键进行分组
user.objects.aggregate(id_count=Count('id')) 返回的时一个字典{'id_count':id的数目}
union V1.union(v2) 查询v1和v2的并集
intersection 用来查询交集 v1.intersection(v2)
difference 用来查询差集: v1.diffrence(v2)
执行模糊查询
.filter(字段名_匹配符)或者get(字段名_匹配符)
__exact ='xxx' 精确等于
__iexact ='xxx' 精确等于忽略大小写
__contains = 'xxx' 内容中包含
__icontains = 'xxx' 内容中包含,情感且忽略答案小写
__gt='x' 大于
__gte ='x' 大于等于
__lt = 'x' 小于
__lte = 'x' 小于等于
__in = [x1,x2] 判断是否在列表内
__startswith = 'xxx' 以什么开头
__istartswith = 'xxx' 以什么开头,忽略大小写
__endswith = 'xxx' 以什么结尾
__iendswith = 'xxx' 以什么结尾,忽略大小写
__range = 'xxx' 在什么以内
__year = 'xx' 什么年份
__month = 'xx' 什么月份
__day = 'xx' 什么日子
isnull = True/False 判断是否为空
多表查询
正向查询
外键字段名__跨表查询的字段名称,然后通过'.'来进行查询
反向查寻
以如果没有在外键中设置rateted_name,就用该模型名称的小写+'_set'来查询
eg:我们用项目反向查询User表 p.user_set.first()
如果我们设置有rateted_name的值,就直接用 p.设置的值.frist()
select_related和prefetch_ralated
在我们使用多表查询时为了减少查询次数一般用select_related和prefetch_ralated
select_related:内部使用的时INNER_JION,用于一对一,一对多
prefetch_raleted分别查询每一张表,然后用python语法处理他们的关系,一般用于多对多,获取的对象中可以进行再次查询