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的单表增删改查的主要内容,如果未能解决你的问题,请参考以下文章

Django 第五篇ORM单表增删改查

Mybatis单表增删改查抽取

Mybatis实现单表增删改查操作

sqlalchemy 单表增删改查

Django项目7 单表增删改查

mybatis---demo1--(单表增删改查)----bai