文章目录
- 1、字段
- 2、字段参数
- 3、打印原生sql
- 4、查询表记录API
- 4.1、all()
- 4.2、filter()
- 4.3、get()
- 4.4、exclude
- 4.5、order_by
- 4.6、reverse
- 4.7、count
- 4.8、first
- 4.9、last
- 4.10、exists
- 4.11、values
- 4.12、values_list
- 4.13、distinct
- 5、基于双下划线的模糊查询
- 5.1、in
- 5.2、gt、lt、gte、lte
- 5.3、range
- 5.4、contains
- 5.5、icontains
- 5.6、startswith
- 5.7、endswith
- 5.8、时间类型
- 6、单表操作
- 6.1、单表增加
- 6.2、单表查询
- 6.3、单表删除
- 6.4、单表修改
- 7、python脚本中调用django环境
- 8、时区和国际化问题
- 9、django admin(管理后台的简单使用)
1、字段
AutoField(Field)
int自增列,必须填入参数 primary_key=True
BigAutoField(AutoField)
bigint自增列,必须填入参数 primary_key=True
注: 当model中如果没有自增列,则自动会创建一个列名为id的列
from django.db import models
class UserInfo(models.Model):
# 自动创建一个列名为id的且为自增的整数列
username = models.CharField(max_length=32)
class Group(models.Model):
# 自定义自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
SmallIntegerField(IntegerField):
小整数 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
正小整数 0 ~ 32767
IntegerField(Field)
整数列(有符号的) -2147483648 ~ 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
正整数 0 ~ 2147483647
BigIntegerField(IntegerField):
长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
BooleanField(Field)
布尔值类型
NullBooleanField(Field):
可以为空的布尔值
CharField(Field)
字符类型
必须提供max_length参数, max_length表示字符长度
TextField(Field)
文本类型
EmailField(CharField):
字符串类型,Django Admin以及ModelForm中提供验证机制
IPAddressField(Field)
字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
GenericIPAddressField(Field)
字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
参数:
protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
URLField(CharField)
字符串类型,Django Admin以及ModelForm中提供验证 URL
SlugField(CharField)
字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
CommaSeparatedIntegerField(CharField)
字符串类型,格式必须为逗号分割的数字
UUIDField(Field)
字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
FilePathField(Field)
字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
参数:
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
FileField(Field)
字符串,路径保存在数据库,文件上传到指定目录
参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
ImageField(FileField)
字符串,路径保存在数据库,文件上传到指定目录
参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串)
DateTimeField(DateField)
日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DateField(DateTimeCheckMixin, Field)
日期格式 YYYY-MM-DD
TimeField(DateTimeCheckMixin, Field)
时间格式 HH:MM[:ss[.uuuuuu]]
DurationField(Field)
长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
FloatField(Field)
浮点型
DecimalField(Field)
10进制小数
参数:
max_digits,小数总长度
decimal_places,小数位长度
BinaryField(Field)
二进制类型
总结,最常用字段
IntegerField 整数
AutoField
BooleanField
CharField
DateField
DateTimeField
DecimalField
FileField 上传文件,本质是varchar
ImageField 图片,本质是varchar,继承了FileField
TextField 存大文本
EmailField 本质是varchar
2、字段参数
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
db_tablespace
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
如: book = models.IntegerField(choices=[(0, '西游记'),(1, '红楼梦'),],default=1)
error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息;
字典健: null, blank, invalid, invalid_choice, unique, and unique_for_date
如: {'null': "不能为空.", 'invalid': '格式错误'}
validators 自定义错误验证(列表类型),从而定制想要的验证规则
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ]
)
总结,最常用参数
null
max_length
default
primary_key
unique
db_index
choices
blank: django admin里提交数据,限制
元数据
class Meta:
db_table = “表名”
# 联合索引
index_together = [
(“name”, “publish”),
]
# 联合唯一索引
unique_together = ((“name”, “publish”),)
# admin中显示的表名称
verbose_name=‘xx表’ # verbose_name加s
verbose_name_plural=‘xx表’
3、打印原生sql
# 在settings中配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
4、查询表记录API
4.1、all()
# 查询所有,返回queryset对象
res = Book.objects.all() # <QuerySet [<Book: Book object>]>
print(res) # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` LIMIT 21; args=()
4.2、filter()
# 它包含了与所给筛选条件相匹配的对象
res = Book.objects.filter(name='西游记') # <QuerySet [<Book: 西游记>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '西游记' LIMIT 21; args=('西游记',)
# 等同于下面这种
res = Book.objects.all().filter(name='西游记')
print(res)
4.3、get()
# 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
res = Book.objects.get(name='水浒传') # Book object
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '水浒传'; args=('水浒传',)
# 等同于下面这种
res = Book.objects.filter(name='水浒传').get()
print(res)
4.4、exclude
# 它包含了与所给筛选条件不匹配的对象,排除,返回queryset对象,可以链式调用
res = Book.objects.exclude(publish='中国出版社') # <QuerySet [<Book: Book object>, <Book: Book object>]>
print(res) # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE NOT (`Book`.`publish` = '中国出版社') LIMIT 21; args=('中国出版社',)
4.5、order_by
# 排序(字段先后,存在顺序) 加-表示降序
res = Book.objects.order_by('price') # <QuerySet [<Book: 水浒传>, <Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>, <Book: 封神榜>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` ORDER BY `Book`.`price` ASC LIMIT 21; args=()
res = Book.objects.order_by('-price') # <QuerySet [<Book: 封神榜>, <Book: 西游记>, <Book: 三国演义>, <Book: 红楼梦>, <Book: 水浒传>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` ORDER BY `Book`.`price` DESC LIMIT 21; args=()
4.6、reverse
# 反向,必须结合order_by使用,对查询结果反向排序
res = Book.objects.order_by('id').reverse() # <QuerySet [<Book: 封神榜>, <Book: 西游记>, <Book: 水浒传>, <Book: 三国演义>, <Book: 红楼梦>]>
print(res) # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` ORDER BY `Book`.`id` DESC LIMIT 21; args=()
4.7、count
# 统计条数,不是QuerySet对象,返回数据库中匹配查询(QuerySet)的对象数量
res = Book.objects.exclude(publish='中国出版社').count() # 2
print(res) # (0.001) SELECT COUNT(*) AS `__count` FROM `Book` WHERE NOT (`Book`.`publish` = '中国出版社'); args=('中国出版社',)
4.8、first
# 返回第一条记录,不是QuerySet对象
res = Book.objects.filter(publish='中国出版社').first() # 红楼梦
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' ORDER BY `Book`.`id` ASC LIMIT 1; args=('中国出版社',)
4.9、last
# 返回最后一条记录,不是QuerySet对象
res = Book.objects.filter(publish='中国出版社').last() # 西游记
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' ORDER BY `Book`.`id` DESC LIMIT 1; args=('中国出版社',)
4.10、exists
# 判断结果有没有值,不是QuerySet对象
res = Book.objects.filter(name='红楼梦').exists() # True
print(res) # (0.000) SELECT (1) AS `a` FROM `Book` WHERE `Book`.`name` = '红楼梦' LIMIT 1; args=('红楼梦',)
res = Book.objects.filter(name='神雕侠侣').exists() # False
print(res) # (0.000) SELECT (1) AS `a` FROM `Book` WHERE `Book`.`name` = '神雕侠侣' LIMIT 1; args=('神雕侠侣',)
4.11、values
# 指定只查某几个字段,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列,model的实例化对象,而是一个可迭代的字典序列
res = Book.objects.filter(publish='中国出版社').values('name','publish') # <QuerySet [{'name': '三国演义', 'publish': '中国出版社'}, {'name': '红楼梦', 'publish': '中国出版社'}, {'name': '西游记', 'publish': '中国出版社'}]>
print(res) # (0.001) SELECT `Book`.`name`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' LIMIT 21; args=('中国出版社',)
4.12、values_list
# 指定只查某几个字段,它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
res = Book.objects.filter(publish='中国出版社').values_list('name','publish') # <QuerySet [('三国演义', '中国出版社'), ('红楼梦', '中国出版社'), ('西游记', '中国出版社')]>
print(res) # (0.001) SELECT `Book`.`name`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' LIMIT 21; args=('中国出版社',)
4.13、distinct
# 从返回结果中剔除重复纪录
res = Book.objects.values('publish').distinct() # <QuerySet [{'publish': '中国出版社'}, {'publish': '上海出版社'}, {'publish': '北京出版社'}]>
print(res) # (0.001) SELECT DISTINCT `Book`.`publish` FROM `Book` LIMIT 21; args=()
res = Book.objects.values('publish','name').distinct() # <QuerySet [{'publish': '中国出版社', 'name': '三国演义'}, {'publish': '上海出版社', 'name': '封神榜'}, {'publish': '北京出版社', 'name': '水浒传'}, {'publish': '中国出版社', 'name': '红楼梦'}, {'publish': '中国出版社', 'name': '西游记'}]>
print(res) # (0.001) SELECT DISTINCT `Book`.`publish`, `Book`.`name` FROM `Book` LIMIT 21; args=()
5、基于双下划线的模糊查询
5.1、in
# 在指定范围内
res = Book.objects.filter(price__in=['29.96', '59.01', '11.99']) # <QuerySet [<Book: 红楼梦>, <Book: 西游记>]>
print(res) # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` IN (11.99, 29.96, 59.01) LIMIT 21; args=(Decimal('11.99'), Decimal('29.96'), Decimal('59.01'))
5.2、gt、lt、gte、lte
# 大于,小于,大于等于,小于等于
# gt lt gte lte
res = Book.objects.filter(price__gt='29') # <QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>, <Book: 封神榜>]>
print(res) # (0.016) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` > 29 LIMIT 21; args=(Decimal('29'),)
res = Book.objects.filter(price__lt='30') # <QuerySet [<Book: 红楼梦>, <Book: 水浒传>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` < 30 LIMIT 21; args=(Decimal('30'),)
res = Book.objects.filter(price__gte='44.98') # <QuerySet [<Book: 三国演义>, <Book: 西游记>, <Book: 封神榜>]>
print(res) # (0.050) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` >= 44.98 LIMIT 21; args=(Decimal('44.98'),)
res = Book.objects.filter(price__lte='29.96') # <QuerySet [<Book: 红楼梦>, <Book: 水浒传>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` <= 29.96 LIMIT 21; args=(Decimal('29.96'),)
5.3、range
# 范围 BETWEEN ... AND ...
res = Book.objects.filter(price__range=['20', '60']) # <QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` BETWEEN 20 AND 60 LIMIT 21; args=(Decimal('20'), Decimal('60'))
5.4、contains
# 包含
res = Book.objects.filter(name__contains='楼') # <QuerySet [<Book: 红楼梦>]>
print(res) # (0.050) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE BINARY '%楼%' LIMIT 21; args=('%楼%',)
5.5、icontains
# 忽略大小写的包含
res = Book.objects.filter(name__icontains='abc') # <QuerySet [<Book: Abc>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE '%abc%' LIMIT 21; args=('%abc%',)
5.6、startswith
# 以...开头, istartswith同理(忽略大小写)
res = Book.objects.filter(name__startswith='A') # <QuerySet [<Book: Abc>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE BINARY 'A%' LIMIT 21; args=('A%',)
5.7、endswith
# 以...结尾, iendswith(忽略大小写)
res = Book.objects.filter(name__endswith='梦') # <QuerySet [<Book: 红楼梦>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE BINARY '%梦' LIMIT 21; args=('%梦',)
5.8、时间类型
# year month day等
res = Book.objects.filter(publish_time__year='2019') # <QuerySet [<Book: Abc>]>
print(res) # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish_time` BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 23:59:59.999999' LIMIT 21; args=('2019-01-01 00:00:00', '2019-12-31 23:59:59.999999')
6、单表操作
6.1、单表增加
# 两种方式
# 第一种:
models.Book.objects.create(name='三国演义',price=10.34,publish='北京出版社')
# 第二种:
book=models.Book(name='西游记',price=11.34,publish='上海出版社')
book.save()
6.2、单表查询
1、查询所有书籍
res = models.Book.objects.all()
print(res)
2、查询名字叫西游记的书(是个列表: QuerySet)
res = models.Book.objects.filter(name='西游记')
res = models.Book.objects.filter(name='西游记')[0]
res = models.Book.objects.filter(name='西游记').first()
查询名字叫西游记的书(就是book对象),如果没有或者有多个,都会报错
查询结果必须有且仅有一个才正常,否则报错
res = models.Book.objects.get(name='sss') # 报错
6.3、单表删除
# 两种方式
# 方式一(QuerySet的delete方法)
res = Book.objects.filter(name='Abc').delete() # (1, {'app01.Book': 1})
print(res) # (0.059) DELETE FROM `Book` WHERE `Book`.`name` = 'Abc'; args=('Abc',)
# 方式二(对象自己的delete方法)
book = Book.objects.filter(name='封神榜').first() # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '封神榜' ORDER BY `Book`.`id` ASC LIMIT 1; args=('封神榜',)
book.delete() # (0.064) DELETE FROM `Book` WHERE `Book`.`id` IN (5); args=(5,)
6.4、单表修改
# 两种方式
# 方式一(QuerySet的delete方法)
res = Book.objects.filter(name='红楼梦').update(price=39.96) # 1
print(res) # (0.058) UPDATE `Book` SET `price` = '39.96' WHERE `Book`.`name` = '红楼梦'; args=('39.96', '红楼梦')
# 方式二(对象自己的)
book = Book.objects.filter(name='红楼梦').last()
book.price = 88.35
book.save() # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '红楼梦' ORDER BY `Book`.`id` DESC LIMIT 1; args=('红楼梦',)
# (0.064) UPDATE `Book` SET `name` = '红楼梦', `price` = '88.35', `publish_time` = '2020-10-17 16:15:14', `publish` = '上海出版社' WHERE `Book`.`id` = 6; args=('红楼梦', '88.35', '2020-10-17 16:15:14', '上海出版社', 6)
7、python脚本中调用django环境
# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
# 1、引入django配置文件(在manage.py中复制)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xxx.settings')
# 2、让djagno启动
import django
django.setup()
# 3、编写代码
pass
8、时区和国际化问题
setting.py中
1、后台管理汉语问题
LANGUAGE_CODE = 'zh-hans' # 管理后台看到的就是中文
2、时区问题(使用东八区)
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
9、django admin(管理后台的简单使用)
1、管理后台是django提供的可以快速对表进行增删查改操作
2、创建一个后台管理账号
python3 manage.py createsuperuser
输入用户名
输入邮箱(可以不填,直接回车)
输入密码
确认密码
# 超级用户创建出来了,可以登录管理后台了
3、admin中表中一行一行的数据显示我们定制的样子
可以重写模型类的__str__方法
4、需要把表注册到admin中
在app下的admin.py中写
from 对应的模块 import models
admin.site.register(models.类名)
5、可以快速的对book表进行增删查改操作