## 1 常用和非常用字段和参数概览
```python
# 常用字段
-IntegerField 整数
-AutoField
-BooleanField
-CharField
-DateField
-DateTimeField
-DecimalField
-FileField 上传文件,本质是varchar
-ImageField 图片,本质是varchar,继承了FileField
-TextField 存大文本
-EmailField 本质是varchar
# 非常用字段
-BigAutoField
-SmallIntegerField
-PositiveSmallIntegerField
-PositiveIntegerField
-BigIntegerField
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
# 常用参数
-null
-max_length
-default
-primary_key
-unique
-db_index
#
-choices:比较常用(后面再说)
-blank: django admin里提交数据,限制
# 元数据
-必须记住的
class Meta:
# 表名
db_table = "book"
#联合索引
index_together = [
("name", "publish"),
]
# 联合唯一索引
unique_together = (("name", "publish"),)
-了解
# admin中显示的表名称
verbose_name='图书表' # 只写verbose_name会在字符串后自动加上s
#verbose_name加s
verbose_name_plural='图书表' # 写verbose_name_plural则会显示verbose_name_plural的内容
```
## 2 打印原生sql
```python
1 配置文件粘贴
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
```
## 3 查询表记录API
```python
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序('-id')
<6> reverse(): 对查询结果反向排序
<8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<9> first(): 返回第一条记录
<10> last(): 返回最后一条记录
<11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<14> distinct(): 从返回结果中剔除重复纪录
```
## 4 基于双下划线的模糊查询
```python
#1 价格在[100,200,300]这个范围内
Book.objects.filter(price__in=[100,200,300])
# 2 大于,小于,大于等于,小于等于
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
# 3 范围
Book.objects.filter(price__range=[100,200])
# 包含
Book.objects.filter(title__contains="python")
# 4 忽略大小写包含
Book.objects.filter(title__icontains="python")
# 5 以xx开头
Book.objects.filter(title__startswith="py")
# 6 时间类型,年份是2012年的
Book.objects.filter(pub_date__year=2012)
# 基于双下滑线的模糊查询
# 1 in条件
# res=models.Book.objects.filter(name__in=['西游记', '红楼梦'])
# print(res)
# 2 大于,小于,大于等于,小于等于
# res=models.Book.objects.filter(id__gt=2)
# res=models.Book.objects.filter(id__lt=2)
# res=models.Book.objects.filter(id__gte=2)
# res=models.Book.objects.filter(id__lte=2)
# print(res)
# 3 range 范围 BETWEEN 1 AND 3
# res=models.Book.objects.filter(id__range=[1,3])
# print(res)
# 包含
# res=models.Book.objects.filter(name__contains="红")
# print(res)
# 忽略大小写的包含
# res=models.Book.objects.filter(name__icontains="红")
# print(res)
#
# res=models.Book.objects.filter(name__startswith="红")
# print(res)
# res = models.Book.objects.filter(name__endswith='梦')
# print(res)
#
# res=models.Book.objects.filter(publish_date__year='2020')
# res=models.Book.objects.filter(publish_date__month='9')
# print(res)
```
## 5 删除表记录
```python
# 删除的两种方式
# 第一种:queryset的delete方法
# res=models.Book.objects.all().delete() # 全部删除
# print(res)
# 第二种:对象自己的delete方法
# book = models.Book.objects.all().filter(name='红楼梦').first()
# print(type(book))
# res=book.delete()
```
## 6 修改表记录
```python
#修改记录
# 第一种:queryset的update方法
# res=models.Book.objects.filter(publish='东京').update(name='红楼梦1')
# print(res)
# 第二种:对象自己的
book = models.Book.objects.filter(name='xxx').last()
book.name='asdfasd'
book.save()
```
## 7 python脚本中调用django环境
```python
# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
#1 引入django配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
# 2 让djagno启动
import django
django.setup()
# 3 使用表模型
from app01 import models
models.Book.objects.create(name='测试书籍',publish='xx出版社')
```
# 补充
1 时区和国际化问题
```python
setting.py中
1 后台管理汉语问题
LANGUAGE_CODE = 'zh-hans' # 管理后台看到的就是中文
2 时区问题(使用东八区)
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
```
2 django admin(管理后台的简单使用)
```python
0 管理后台是django提供的可以快速对表进行增删查改操作
1 创建一个后台管理账号
python3 manage.py createsuperuser
输入用户名
输入邮箱(可以不填,敲回车)
输入密码
确认密码
# 超级用户创建出来了,可以登录管理后台了
2 admin中表中一行一行的数据显示我们定制的样子
重写模型类的__str__方法
```
3 blank参数作用
```python
1 需要把book表注册到admin中
在app下的admin.py中写
from app01 import models
# 把book表注册一些,管理后台就能看到了
admin.site.register(models.Book)
2 可以快速的对book表进行增删查改操作
```
# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
# 1 引入django配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
# 2 让djagno启动
import django
django.setup()
# 3 使用表模型
from app01 import models
# models.Book.objects.create(name='测试书籍',publish='xx出版社')
#### 单表api操作
# 1 all 查询所有,返回queryset对象,目前先当成列表(像列表)
# res=models.Book.objects.all()
# print(res)
# from django.db.models.query import QuerySet
# print(type(res))
# 2 filter 过滤 queryset对象的方法
# res=models.Book.objects.filter(name='红楼梦')
# print(res)
# res=models.Book.objects.all().filter(name='红楼梦')
# print(res)
# res = models.Book.objects.all().filter(name='红楼梦',publish='东京出版社')
# print(res)
# print(type(models.Book.objects)) # 暂时不用管
# 3 get queryset对象的方法
# res = models.Book.objects.all().get(name='红楼梦')
# res = models.Book.objects.get(name='红楼梦')
# res = models.Book.objects.filter().get(name='红楼梦')
#4 exclude 排除 ,返回queryset对象,可以继续链式调用
# 查询名字不是红楼梦的数据
# res=models.Book.objects.exclude(name='红楼梦')
# print(res)
# 5 order_by 排序(先后,由顺序) “-”表示降序
# res=models.Book.objects.all().order_by('id')
# res=models.Book.objects.all().order_by('-id')
# res=models.Book.objects.all().order_by('name','-id',)
# res=models.Book.objects.all().order_by('-id','name')
# print(res)
# 6 reverse 反向 ,必须结合order_by使用,对结果进行反转
# 等同于 ('-i')
# res = models.Book.objects.exclude(name='红楼梦').order_by('id')
# # res = models.Book.objects.exclude(name='红楼梦').order_by('id').reverse()
# print(res)
# 7 count 统计条数
# res=models.Book.objects.exclude(name='红楼梦').count()
# res=models.Book.objects.all().count()
# print(res)
# 9 first 返回结果不再是queryset对象了
# res = models.Book.objects.exclude(name='红楼梦').first()
# print(res)
# 10 last 返回结果不再是queryset对象了
# res = models.Book.objects.exclude(name='红楼梦').last()
# print(res)
#11 exists() 判断结果有没有值 返回结果不再是queryset对象了
# res = models.Book.objects.exclude(name='红楼梦').exists()
# print(res)
# res = models.Book.objects.filter(name='红楼梦dasf').exists()
# print(res)
#12 values select name from book; 指定只查某几个字段
# res = models.Book.objects.all().values('name','publish') # 查询name和publish字段
# res = models.Book.objects.all().values('name','publish').first()
#
# print(type(res))
# 13 values_list
# res = models.Book.objects.all().values_list('name','publish').first() # 只查出value值,结果是元组
# print(res)
# print(type(res))
# 14 distinct 对结果进行去重
# res = models.Book.objects.all().values('name','publish').distinct()
# res = models.Book.objects.all().values('name').distinct()
# print(res)
# 基于双下划线的模糊查询
# 1 in条件
# res=models.Book.objects.filter(name__in=['西游记', '红楼梦'])
# print(res)
# 2 大于,小于,大于等于,小于等于
# res=models.Book.objects.filter(id__gt=2)
# res=models.Book.objects.filter(id__lt=2)
# res=models.Book.objects.filter(id__gte=2)
# res=models.Book.objects.filter(id__lte=2)
# print(res)
# 3 range 范围 BETWEEN 1 AND 3
# res=models.Book.objects.filter(id__range=[1,3])
# print(res)
# 包含
# res=models.Book.objects.filter(name__contains="红")
# print(res)
# 忽略大小写的包含
# res=models.Book.objects.filter(name__icontains="红")
# print(res)
#
# res=models.Book.objects.filter(name__startswith="红")
# print(res)
# res = models.Book.objects.filter(name__endswith='梦')
# print(res)
#
# res=models.Book.objects.filter(publish_date__year='2020')
# res=models.Book.objects.filter(publish_date__month='9')
# print(res)
# 删除的两种方式
# 第一种:queryset的delete方法
# res=models.Book.objects.all().delete()
# print(res)
# 第二种:对象自己的delete方法
# book = models.Book.objects.all().filter(name='红楼梦').first()
# print(type(book))
# res=book.delete()
#修改记录
# 第一种:queryset的update方法
# res=models.Book.objects.filter(publish='东京').update(name='红楼梦1')
# print(res)
# 第二种:对象自己的
book = models.Book.objects.filter(name='xxx').last()
book.name='asdfasd'
book.save()
# models.Book.objects.create(name='sdafasd',publish='ddd')