ORM是Django操做数据库的API,Django的做者将sql语句封装在里面供咱们使用。mysql
咱们前面还提到过Django提供一个模拟数据库的工具,sqlite,供咱们学习测试使用。sql
若是咱们想使用mysql,须要在setting中更改database选项,修改数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'books', #你的数据库名称 'USER': 'root', #你的数据库用户名 'PASSWORD': '', #你的数据库密码 'HOST': '', #你的数据库主机,留空默认为localhost 'PORT': '3306', #你的数据库端口 } }
而后修改__init__文件 写入 import pymysql pymysql.install_as_MySQLdb()django
以前说过,在数据库中建立表的时候就是在modules中建立类json
class School(models.Model): name = models.CharField(max_length=32,blank=True,verbose_name='名称') mac = models.URLField(max_length=32,blank=True,verbose_name='名称') ## URL 类型(其实数据类型都是同样的,不过django在处理的时候会作一些判断) mail = models.EmailField(max_length=32,blank=True,verbose_name='邮箱') yes_no = models.BooleanField(max_length=32,blank=True,verbose_name='是否') date = models.DateField(default="",verbose_name="日期") num = modelsIntegerField(default="",verbose_name="日期")函数
class Number(models.Model): models.OneToOneField(to='UserInfo',verbose_name="学号")工具
学号可能和userinfo是一一对应的的关系,那么咱们能够把他们写成onetoone ,其实也能够直接把他写进userinfo的表里性能
cla = models.ForeignKey(to='Class') #会连接表(根据生成的ID)
models.ManyToManyField(to='UserInfo')
这种会在数据库中生成新的表,记录ID学习
class UserInfo(models.Model): username=models.CharField(max_length=32,null=True) password=models.CharField(max_length=32,null=True) def str(self): return self.username ##这样能够直接返回username的内容,在后面的ORM的查询中很方便测试
咱们先在views中修改以前的test函数
def test(request): dic = {'a':1,'b':2} dic_json = json.dumps(dic) school_li = models.School.objects.all() ## 会返回一个列表 for item in school_li: print (school_li) ## 咱们在models的School类中定义了一个函数 __str__,咱们能够经过这个来发现它的做用,直接打印school_li就能够打印结果 print (item,type(item)) return HttpResponse(dic_json)
school = models.School.objects.get(id=1) print (school,type(school),school.name)
obj = models.School.objects.filter(name='No.1school') print (obj)
obj = models.School.objects.filter(name='No.1school').first() ##第一个值 obj = models.School.objects.filter(name='No.1school').last() ##最后一个值
检索的时候有get和filter两种方法,推荐使用filter,当get查不到值的时候会报错,可是filter会返回空的QuerySet list
dic = {'name':'No.1school'} obj = models.School.objects.filter(**dic).first() print (obj)
dic1 = {'name':'New_school'} obj = models.School.objects.create(**dic1) print (obj,type(obj),obj.name)
删除实际上是基于filter来实现的,能够查完对返回的对象进行删除操做 dic = {'name':'No.1school'} obj = models.School.objects.filter(**dic).first() obj.delete()
也能够直接这样
dic1 = {'name':'New_school'} obj = models.School.objects.filter(**dic1).delete() print (obj,type(obj))
咱们新建了两张表
(2, {'Django111.School': 2}) <class 'tuple'>
返回的是一个元组,第一个值是删除的条数,第二个是属于哪一个类,删除的条数
dic1 = {'name':'New_school'} dic2 = {'name':'New_school2'} obj = models.School.objects.filter(**dic2).update(**dic1) print(obj,type(obj))
会返回修改次数,数据类型是int
除此以外能够用get的方式
使用方法和filter相似
dic = {'name':'No.1school'} obj = models.School.objects.get(**dic) obj.name="New_No.1school" obj.save() print(obj,type(obj)) >>> New_No.1school <class 'Django111.models.School'>
get方法的性能会比filter略差,且查不到值的时候会报错,因此咱们在修改数据的时候推荐使用filter方法