ORM的单表增删改查
Posted 唐宋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM的单表增删改查相关的知识,希望对你有一定的参考价值。
一、与数据库的映射关系
类名 <-------> 表名
属性 <------->字段
属性的约束 <------->字段的类型
实例对象 <-------> 表记录
在setting中如下设置,可以查看翻译成的sql语句
LOGGING = {
\'version\': 1,
\'disable_existing_loggers\': False,
\'handlers\': {
\'console\':{
\'level\':\'DEBUG\',
\'class\':\'logging.StreamHandler\',
},
},
\'loggers\': {
\'django.db.backends\': {
\'handlers\': [\'console\'],
\'propagate\': True,
\'level\':\'DEBUG\',
},
}
}
二、创建类
1、在文件modal.py里创建类,继承models.Model
class Student(models.Model):
nid=models.AutoField(primary_key=True) #int自增 ,并设为主键
name=models.CharField(max_length=10) #varchar ,
birth=models.DateField() #Date
class_id=models.IntegerField(default=0) #int
之后要告诉Django使用这些模型,需要在setting中INSTALLED_APPS,添加当前model目录的位置,\'app01.apps.App01Config\',这个列表的元素是所有注册了的应用名称
然后在终端输入
python manage.py makemigrations 此时会在models.py 的目录下生产migrations文件夹,里面是一些配置
python manage.py migrate 此时会在数据库生产表,表名会默认带上应用的目录名前缀
如果之后要增加字段,例如
xxss_id=models.IntegerField()
如果没有给默认值,此时执行python manage.py makemigrations 会提示
实例化对象就是插入信息
s=Student(name="alex", birth="2017-12-12")
s.save() #提交
如果用不是Django自带的数据库,要注意设置:
在setting中修改
DATABASES = {
\'default\': {
\'ENGINE\': \'django.db.backends.mysql\',
\'NAME\': \'day74\', #你的数据库名称
\'USER\': \'root\', #你的数据库用户名
\'PASSWORD\': \'123\', #你的数据库密码
\'HOST\': \'\', #你的数据库主机,留空默认为localhost
\'PORT\': \'3306\', #你的数据库端口
\'OPTIONS\':{ #严格模式,not null 的时候,不能为空
\'init_command\':"SET sql_mode=\'STRICT_TRANS_TABLES\'"
},
}
}
然后在models.所在目录的__init__.py中添加
import pymysql
pymysql.install_as_MySQLdb()
二、常用字段类型
models.AutoField(primary_key=True) #int自增 ,并设为主键
models.CharField(max_length=10) #varchar 类型 ,
models.DateField() #日期类型
models.IntegerField(default=0) #int
models.EmailField() #email类型,其实也是字符串,只是Django在会检测是否符合email格式
models.DecimalField(max_digits=5,decimal_places=2) #精确小数类型,总长对多5,小数位最多2,999.99
objects 管理器
一、增加
方式1 :
s=Student(name=\'\',class_id=\'\')
s.save()
方式2:
stu_obj=Student.objects.create(name=\'\',class_id=\'\')\'
返回创建的记录对象
二、删除
查询出然后删除
Student.objects.filter(nid=id).delete()
三、修改
Student.objects.filter(nid=id).update(name=\'xx\',class_id=\'ss\')
#如果request.POST里所有的内容都要被更新到表中,可以
Student.objects.filter(nid=id).update(**request.POST)
##关键字传参,注意POST里的crsf相关的
##不能get(xx).update(...)
对于日期类型的字段要注意,input框中要规定好日期格式,否则无法识别。也不能直接在pycharm的Database工具里直接修改日期
<input type="date" name="birth" value="{{ stu.birth|date:\'Y-m-d\' }}">
四、查询
1、单表查询
QueySet 不支持负索引 ,[-3]
Student.objects.all() #返回QuerySet类型,查询所有记录,[obj1,obj2...]
Student.objects.filter() #返回QuerySet类型,查询符合条件的记录
Student.objects.exclude() #返回QuerySet类型,查询不符合条件的记录
Student.objects.get() #返回models对象,查询结果必须有且只有一个,否则报错
Student.objects.all().first() #返回models对象,取出查询结果中的第一个
Student.objects.filter().last() #返回models对象,取出查询结果中的最后一个
Student.objects.all().values("name","class_id") #只用来显示,返回QuerySet类型,元素是字典[{\'name\':\'xx\',\'class_id\':\'zz\'},{\'name\':\'xx\',\'class_id\':\'zz\'}... ]
Student.objects.all().values_list("name","class_id") #只用来显示,返回QuerySet类型,元素是元组[(xx,zz),(aa,bb)...]
Student.objects.all().order_by("class_id") #按class_id升序 排序,不指定则按主键排序
Student.objects.all().order_by("-class_id") #加个负号,按class_id降序排序
Student.objects.all().reverse() #对结果反向排序,可以回避QueySet 不支持负索引的问题
Student.objects.all().count() #返回记录的个数
Student.objects.all().exists() #是否有数据,返回True或False
Student.objects.values("class_id").distinct() #对结果去重
只有values,values_list 的去重有意义,而all、filter等查出的结果,都是 models对象的列表[obj1,obj2..]不可能有重复的
备注:对于日期数据
Student.objects.filter(birth__year="2017") #查询年份是2017的
Student.objects.filter(birth__month="12") #查询月份是12的
Student.objects.filter(birth__day="15") #查询天数是12的
2、双下划线的单表查询
Student.objects.filter(id__gt=1,id__lt=10) #id 大于1 且 小于10的 __gt= 相当于> ,__lt= 相当于<
Student.objects.filter(id__in[11,22,33]) #id 值等于11,22,33的数据
Student.objects.exclude(id__in=[11,22,33]) #not in
Student.objects.filter(name__contains="e") #name包含\'e\',sql里的like
Student.objects.filter(name__icontains="e") #name包含e 不区分大小写
Student.objects.filter(name__iexact="alex") #name 是alex的,不区分大小写
Student.objects.filter(id__range=[1,5]) #范围 between and 包括5
startswith,istartswith,endswith,iendswith #开头结尾,i 不区分大小写
以上是关于ORM的单表增删改查的主要内容,如果未能解决你的问题,请参考以下文章