一、与数据库的映射关系
类名 <-------> 表名
属性 <------->字段
属性的约束 <------->字段的类型
实例对象 <-------> 表记录
在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 不区分大小写