码迷,mamicode.com
首页 > 其他好文 > 详细

ORM的单表增删改查

时间:2017-12-11 00:51:18      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:e30   内容   创建   mod   clu   大于   用户名   update   max   

一、与数据库的映射关系
 
          类名 <-------> 表名
          属性 <------->字段
属性的约束 <------->字段的类型
   实例对象 <-------> 表记录
 
在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的单表增删改查

标签:e30   内容   创建   mod   clu   大于   用户名   update   max   

原文地址:http://www.cnblogs.com/tangjianyu/p/8018745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!