Django 数据迁移命令与创建子项目,Django打印 sql 语句配置,Django(ORM)对表字段的增删改查,Django单表查询,基于单表的双下划线模糊查询
Django 数据迁移命令,创建子项目,手动创建用户
创建app01: python3 manage.py startapp app01
Django 数据迁移命令 (1)python3 manage.py makemigrations 对数据做记录 (2)python3 manage.py migrate 提交到数据库 (3)python3 manage.pu showmigrations 查看哪个数据没有提交到数据库
(4) python3 manage.py creatsuperuser 创建超级用户
Django打印 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', }, } }
Django 单表操作
链接表
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME':'day76', 'USER':'root', 'PASSWORD':'321', 'HOST':'127.0.0.1', 'PORT':'3306' } }
创建表
创建字段名
from django.db import models # Create your models here. class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5,decimal_places=2) publish = models.CharField(max_length=32) auther = models.CharField(max_length=32,default='') create_data = models.DateField(null=True)
__init__文件里
import pymysql pymysql.install_as_MySQLdb()
最后通过两条数据库迁移命令即可在指定的数据库中创建表 :
(1)python3 manage.py makemigrations 对数据做记录
(2)python3 manage.py migrate 提交到数据库
确保配置文件中的INSTALLED_APPS中写入我们创建的app名称
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', "app01" ]
列操作-增加删除字段名
删除,直接注释掉字段,执行数据库迁移命令即可
新增字段,在类里直接新增字段,直接执行数据库迁移命令会提示输入默认值,可以自己设置默认值
auther = models.CharField(max_length=32,default='')
行操作-添加表记录
增:(时间格式可以传 时间格式/字符串/日期格式 ) (1)Book = models.Book.objects.create(name='西游记',price='2.8',publish='人名出版社', auther='吴承恩',create_data=datetime.datetime.now()) (2)Book = models.Book(name='水浒传',price='5.8',publish='浙江出版社', author='施耐庵',create_data='2018-9-15') Book.save()
行操作-删除表记录
删: (1)models.Book.objects.filter(id=1).delete() (2)ret = models.Book.objects.filter(name='西游记').first() ret.delete()
行操作-改表记录
改: (1)models.Book.objects.filter(name='三国').update(name='七国',auther='啊三') (2)obj = models.Book.objects.filter(name='七国').first() obj.name = '八国' obj.save()
行操作-单表查询相关操作
(1)all() 所有 (2)filter() 过滤 (4)get() 有且只有一个结果,才能用,如果有一个,返回的是对象,不是queryset对象,通常用在,用id查询的情况 (5)exclude() 查询名字不叫 红楼梦 的书 (6)order_by() 排序,默认升序 (7)reverser() 有顺序才能反序 (8)count 计算结果的次数 (9)last() 最后一个 (10)exists() 返回布尔类型,是否存活 (11)values('name','price') 列表里套字典 (12)values_list() 列表里套元组 (13)distinct 去重 必须完全一样,才能去重 只要带了id,去重就没有意义了
查: (1)all()所有 models.Book.objects.all() (2)filter()过滤 obj_list = models.Book.objects.filter(name='红楼梦').first() obj_list = models.Book.objects.filter(name='红楼梦')[0] *索引不支持负数 obj_list = models.Book.objects.filter(name='红楼梦',create_data='2012-07-07') *传多个参数是 and 的意思 (4)get() 有且只有一个结果,才能用,如果有一个,返回的是对象,不是queryset对象,通常用在,用id查询的情况 obj = models.Book.objects.get(name='红楼梦') print(obj.name) (5)exclude() 查询名字不叫 红楼梦 的书 obj = models.Book.objects.exclude(name='红楼梦') print(obj) obj = models.Book.objects.exclude(name='红楼梦',price='6.8') *传多个参数是 and 的意思 (6)order_by() 排序,默认升序 obj_list = models.Book.objects.order_by('price') 升序 obj_list = models.Book.objects.order_by('-price') 降序 obj_list = models.Book.objects.order_by('-price','create_data') 传多个参数优先排前面的 (7)reverser() 有顺序才能反序 models.Book.objects.order_by('-price').reverser() (8)count 计算结果的次数 con = models.Book.objects.all().count() con = models.Book.objects.filter(name = '红楼梦').count() (9)last 最后一个 con = models.Book.objects.last() print(con) (10)exists() 返回布尔类型,是否存活 con = models.Book.objects.filter(name= '三国').exists() print(con) (11)values('name','price') 列表里套字典 con = models.Book.objects.all().values() con = models.Book.objects.all().values('name','price') print(con) (12)values_list() 列表里套元组 con = models.Book.objects.all().values_list('name','price') print(con) (13)distinct 去重 必须完全一样,才能去重 只要带了id,去重就没有意义了 con = models.Book.objects.all().values('name').distinct() print(con)
行操作-单表模糊查询
__gt 大于 __gte 大于或等于
__lt 小于 __lte 小于或等于 __in 在……里 __range[50,100] # 在……里,首尾都能取到
__isnull=0|1 # 0:is not null | 1:is null 是否为空
# 字符串相关
__startswith # 后方模糊匹配
__endswith # 前方模糊匹配
__contains # 前后方均模糊匹配
__regex # 正则匹配
__istartswith # 不区分大小写后方模糊匹配(i开头就是不区分大小写)
__contains 包含有……的书,查询名字有'%红%'的书
__icontains 包含有……的书,忽略大小写
__startswith 以……开始
__endswith 以……结尾
时间模糊查找:
__year/__month/__day 按年/月/日查询
eg:
birthday__year=2008 # 时间年份模糊匹配
(1) __gt 大于 __gte 大于或等于 con = models.Book.objects.filter(price__gt='5') print(con) (2) __lt 小于 __lte 小于或等于 con = models.Book.objects.filter(price__lt='5') print(con) (3) __in 在……里 con = models.Book.objects.filter(price__in=['1','2','3.80']) print(con) (4) __range[50,100] 在……里,首尾都能取到 con = models.Book.objects.filter(price__range=['3.80','5.8']) print(con) (5) __contains 包含有……的书,查询名字有'%红%'的书 __icontains 包含有……的书,忽略大小写 con = models.Book.objects.filter(name__contains='红') print(con) (6) __startswith 以……开始 __endswith 以……结尾 con = models.Book.objects.filter(name__startswith='红') print(con) (6) __year/__month/__day 按年/月/日查询 con = models.Book.objects.filter(create_data__month='11') print(con)
作业
1 查询老男孩出版社出版过的价格大于200的书籍
2 查询2017年8月出版的所有以py开头的书籍名称
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
4 查询价格在100到200之间的所有书籍名称及其价格
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
6 查找所有书名里包含楼的书
7 查找出版日期是2017年的书
8 查找出版日期是2017年的书名
9 查找价格大于10元的书
10 查找价格大于10元的书名和价格
(1).filter(publish='老男孩出版社',price__gt='200') (2) .filter(create_data__year).filter(create_data__month).filter(name__startswith = 'py').values('name') (3).filter(price__in = [50,100,150]).values('name','publish') (4).filter( price__range = [100,200] ).values('name','price) (5).filter(publish='人民出版社').order_by('-price').values('name').distinct().values('price') (6).filter( name__contains = '楼' ) (7).filter( name__year = '2017' ) (8).filter( create_data__year = '2017' ).values('name') (9).filter(price__gt='10') __gt 大于 __lt小于 (10).filter(price__gt='10').values('name','price')