Django单表查询 常用字段
一、常用字段和非常用字段
# 常用字段 -IntegerField 整数 -AutoField 自增字段 -BooleanField bool类型 -CharField 字符串类型 -DateField 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。 -DateTimeField 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例 -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_plural='图书表'
二、打印原生sql
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', }, } }
三、查询表记录API
# 1. get(**kwargs) # 1.1: 有参,参数为筛选条件 # 1.2: 返回值为一个符合筛选条件的记录对象(有且只有一个),如果符合筛选条件的对象超过一个或者没有都会抛出错误。 obj=Employee.objects.get(id=1) print(obj.name,obj.birth,obj.salary) #输出:Egon 1997-01-27 100.1 # 2、first() # 2.1:无参 # 2.2:返回查询出的第一个记录对象 obj=Employee.objects.first() # 在表所有记录中取第一个 print(obj.id,obj.name) # 输出:1 Egon # 3、last() # 3.1: 无参 # 3.2: 返回查询出的最后一个记录对象 obj = Employee.objects.last() # 在表所有记录中取最后一个 print(obj.id, obj.name) # 输出:9 Egon # 4、count(): # 4.1:无参 # 4.2:返回包含记录对象的总数量 res = Employee.objects.count() # 统计表所有记录的个数 print(res) # 输出:9 # 注意:如果我们直接打印Employee的对象将没有任何有用的提示信息,我们可以在模型类中定义__str__来进行定制 class Employee(models.Model): ...... # 在原有的基础上新增代码如下 def __str__(self): return "<%s:%s>" %(self.id,self.name) # 此时我们print(obj)显示的结果就是: <本条记录中id字段的值:本条记录中name字段的值>
!!!强调!!!:下述方法查询的结果都有可能包含多个记录对象,为了存放查询出的多个记录对象,django的ORM自定义了一种数据类型Queryeset,所以下述方法的返回值均为QuerySet类型的对象,QuerySet对象中包含了查询出的多个记录对象
# 1、filter(**kwargs): # 1.1:有参,参数为过滤条件 # 1.2:返回值为QuerySet对象,QuerySet对象中包含了符合过滤条件的多个记录对象 queryset_res=Employee.objects.filter(department='技术部') # print(queryset_res) # 输出: <QuerySet [<Employee: <2:Kevin>>, <Employee: <5:Jack>>, <Employee: <6:Robin>>]> # 2、exclude(**kwargs) # 2.1: 有参,参数为过滤条件 # 2.2: 返回值为QuerySet对象,QuerySet对象中包含了不符合过滤条件的多个记录对象 queryset_res=Employee.objects.exclude(department='技术部') # 3、all() # 3.1:无参 # 3.2:返回值为QuerySet对象,QuerySet对象中包含了查询出的所有记录对象 queryset_res = Employee.objects.all() # 查询出表中所有的记录对象 # 4、order_by(*field): # 4.1:有参,参数为排序字段,可以指定多个字段,在字段1相同的情况下,可以按照字段2进行排序,以此类推,默认升序排列,在字段前加横杆代表降序排(如"-id") # 4.2:返回值为QuerySet对象,QuerySet对象中包含了排序好的记录对象 queryset_res = Employee.objects.order_by("salary","-id") # 先按照salary字段升序排,如果salary相同则按照id字段降序排 # 5、values(*field) # 5.1:有参,参数为字段名,可以指定多个字段 # 5.2:返回值为QuerySet对象,QuerySet对象中包含的并不是一个个的记录对象,而上多个字典,字典的key即我们传入的字段名 queryset_res = Employee.objects.values('id','name') print(queryset_res) # 输出:<QuerySet [{'id': 1, 'name': 'Egon'}, {'id': 2, 'name': 'Kevin'}, ......]> print(queryset_res[0]['name']) # 输出:Egon # 6、values_list(*field): # 6.1:有参,参数为字段名,可以指定多个字段 # 6.2:返回值为QuerySet对象,QuerySet对象中包含的并不是一个个的记录对象,而上多个小元组,字典的key即我们传入的字段名 queryset_res = Employee.objects.values_list('id','name') print(queryset_res) # 输出:<QuerySet [(1, 'Egon'), (2, 'Kevin'),), ......]> print(queryset_res[0][1]) # 输出:Egon
四、基于双下划线的模糊查询
1、删除记录
# 删除的两种方式 # 第一种:queryset的delete方法 # res=models.Book.objects.all().delete() # print(res) # 第二种:对象自己的delete方法 # book = models.Book.objects.all().filter(name='金瓶没1').first() # print(type(book)) # res=book.delete()
2、修改表记录
#修改记录 # 第一种: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()
五、python脚本中调用Django环境
如果不想让Django项目通过游览器发送一个请求响应运行sql查询 就配置python脚本中调用Django环境 鼠标点点完成测试
# 在脚本中调用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出版社')
六、配置时区和国际化问题
setting.py中 1 后台管理汉语问题 LANGUAGE_CODE = 'zh-hans' # 管理后台看到的就是中文 2 时区问题(使用东八区) TIME_ZONE = 'Asia/Shanghai' USE_TZ = False
七、配置管理后台的使用(Django admin)
0 管理后台是django提供的可以快速对表进行增删查改操作 1 创建一个后台管理账号 python3 manage.py createsuperuser 输入用户名 输入邮箱(可以不填,敲回车) 输入密码 确认密码 # 超级用户创建出来了,可以登录管理后台了 2 admin中表中一行一行的数据显示我们定制的样子 重写模型类的__str__方法
blank参数作用
1 需要把book表注册到admin中 在app下的admin.py中写 from app01 import models # 把book表注册一些,管理后台就能看到了 admin.site.register(models.Book) 2 可以快速的对book表进行增删查改操作
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)