ORM
全称:对象--关系--映射
数据表----类
数据行----对象
字 段----属性
优势:专注于后端逻辑,不用写复杂的sql语句
劣势:会忘掉sql,牺牲了效率
Django连接mysql数据库:
1 DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'orm1', # 连接的数据库,需要自己提前创建好 5 'USER':'root', # 连接数据库的用户名 6 'PASSWORD':'root', # 连接数据库的密码 7 'HOST':'127.0.0.1', # 连接主机,默认本机 8 'PORT':3306, # 端口,默认3306 9 } 10 }
项目目录下的__init__.py
1 import pymysql 2 pymysql.install_as__MYSQLdb()
创建模型:app下的models.py
1 # Create your models here. 2 class Book(models.Model): 3 id = models.AutoField(primary_key=True) 4 title = models.CharField(max_length=32) 5 pub_date = models.DateField() 6 price = models.DecimalField(max_digits=8,decimal_places=2) 7 publish = models.CharField(max_length=32) 8 9 def __str__(self): 10 return self.title
常用字段:
1 常用字段类型 2 # 主键、自增 id = models.AutoField(primary_key=True) 3 # varchar name = models.CharField(max_length=16) 后面一定要有长度 代表varchar(16) 4 # 整数 age = models.IntegerField() 5 # 浮点数 price = models.DecimalField(max_digits=8,decimal_places=2) 最大长度八位,小数点后面两位 6 # 日期时间 birth = models.DateTimeField(auto_now_add=True) 对象创建时自动添加当前时间 就好比人出生就有一个生日一样 7 # 日期 pub_date = models.DateField(auto_now=True) 对象每次修改时修改为当前时间 两个互斥 不可共存 8 # 大文本类型 content = model.TextField()
自定义字段:
1 class MyCharField(models.Field): 2 """ 3 继承model.Field 4 自定义的char类型字段 5 """ 6 def __init__(self,max_length,*args,**kwargs): 7 # super(MyCharField, self).__init__(max_length=max_length,*args,**kwargs) 8 super().__init__(max_length,*args,**kwargs) 9 # models.Field.__init__(self,max_length=max_length,*args,**kwargs) 10 self.max_length = max_length 11 12 def db_type(self, connection): 13 """ 14 限定生产数据库表的字段类型为char,长度为max_length指定的值 15 :param connection: 16 :return: 17 """ 18 return 'char(%s)'%self.max_length
字段参数:
1 字段参数 2 null = True 和数据库直接关联 3 blank = True 和表单提交验证关联 一般同时写上 4 db_column 列名 数据库显示的列名 但是orm还是自己的列名 5 default 默认值 6 unique 唯一索引 7 verbose_name admin显示中文 8 choices sex = models.CharField(max_length=2,choices=(('1','男'),('2','女'),('3','未知'))) 数据库存的是前面的,要显示后面的用obj.get_sex_display() 9 模版取值{{ user|func:'sex'}} func是自己写的过滤器
Meta配置:
class Meta: # 数据库生成的表名 db_table='table_name' verbose_name='admin站点表名显示的名称' verbose_name_plural='对象是复数时显示的名称' #联合唯一索引 unique_together=[ ('field1','field2') ]
生成迁移文件:
1 python manage.py makemigrations
执行迁移:
1 python manage.py migrate
必知必会13条查询方式:
为了方便查询,添加django环境。直接运行py文件
import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM1.settings") import django django.setup() from app01.models import Book # 对象列表 # ret = Book.objects.all() # print(ret) # get 不存在就报错 获取多个就报错 # ret = Book.objects.get(pk=3) # print(ret) # Java ret.price # filter 返回queryset集合 不存在返回空, # ret= Book.objects.filter(pk=3) # print(ret) # <QuerySet [<Book: Java>]> ret[0].price # exclude 排除 不包含 # ret = Book.objects.exclude(id=3) # print(ret) # 返回queryset集合 获取指定参数,默认获取所有 相当于select * form Book 的 * 字典类型 # ret = Book.objects.all().values() # # ret = Book.objects.all().values('title','price') # # print(ret) # 返回queryset集合 和values一样,但是是元祖形式 # ret = Book.objects.all().values_list('title','price') # print(ret) # order_by 排序可以按照多个字段 # ret = Book.objects.order_by('-pk','price') # print(ret) # reverse 反转 对排序后的结果再反转 # ret = Book.objects.order_by('-pk', 'price').reverse() # print(ret) # distinct 去重 针对的是对字段去重 对all使用无任何意义 # ret = Book.objects.all().values('title').distinct() # print(ret) # count 计数 # ret = Book.objects.all().count() # print(ret) # exists 判断数据是否存在 # ret = Book.objects.filter(pk=3).exists() # print(ret) # -----------------------------------模糊查询----------------------------------- print(Book.objects.filter(price__gt=70).values('title','price')) # 大于 等于在后面加e print(Book.objects.filter(price__lt=70).values('title','price')) # 小于 等于在后面加e print(Book.objects.filter(title__startswith='P')) # <QuerySet [<Book: Python>]> print(Book.objects.filter(title__icontains='p')) # <QuerySet [<Book: Python>, <Book: php>]> print(Book.objects.filter(price__in=[66,99])) print(Book.objects.filter(price__range=[60,90]))
总结:
1 总结: 2 返回queryset集合 3 all() 4 filter() 5 exclude() 6 order_by 7 reverse() 8 values() {} 9 values_list() () 10 distinct() 11 返回对象 12 get() 13 first() 14 last() 15 16 返回布尔值 17 exists() 18 19 返回数字 20 count()
查询之后才能进行更新或删除操作
删除:
1 ret = Book.objects.filter(title='Linux').delete() 2 Book.objects.filter(publish='人民出版社').first().delete() 3 print(ret) # 元祖 返回个数和记录
更新:
1 # update 更新 调用者 queryset 2 Book.objects.filter(id=1).update(price=99.99)