shell指令

  • 命令
      python manage.py shell
在Terminal,执行上面这个指令会进入到python解释器环境中,并且加载了我们当前django项目配置环境,所以可以在当前shell使用django内部的功能,如
from app01 import models
models.Book.object.all();
或者直接在Python Console里面使用上述代码也可以

基于双下划线的模糊查询

      from app01 import models
def book(request):
#都是返回QuerySet类型
models.Book.objects.filter(price__in=[100,200,300])#price值等于这三个里面存在的所有QuerySet类型对象
示例:
ret = models.Book.object.filter(price__in=['20.11','30.11',])#针对decimal字段要用字符串 返回所有符号列表数据的QuerySet对象
ret = models.Book.object.filter(price__in=[20,18])#针对float或者int类型要用数字
ret = models.Book.object.filter(price__gt=100)#大于
ret = models.Book.object.filter(price__gte=100)#大于等于
ret = models.Book.object.filter(price__lt=100)#小于
ret = models.Book.object.filter(price__lte=100)#小于等于
ret = models.Book.object.filter(price__range=[100,200])#大于等于100,小于等于200 #针对一些字符串数据操作
#找到包含某些字符串的数据
ret = models.Book.objects.filter(title__contains='python')#title值中包含python返回<QuerySet [<Book: python>, <Book: cpython>]> QuerySet类型
ret = models.Book.objects.filter(title__icontains='python')#不区分大小写 #找到以某些字符串开头或者结尾的数据
models.objects.filter(title__startswith='py')#以什么开头
models.objects.filter(title__istartswith='p')#不区分大小写以什么开头
models.objects.filter(title__endswith='py')#以什么结尾
models.objects.filter(title__iendswith='p')#不区分大小写,以什么结尾 #日期时间类型数据的操作 返回QuerySet类型
#按照年份查 下面两种写法都正确
models.Book.objects.filter(pub_date__year=2012)
models.Book.objects.filter(pub_date__year='2012') #某年某月的
models.Book.objects.filter(pub_date__year=2012,pub_date__month=7)
#查看某年某月某日
models.Book.objects.filter(pub_date__year=2012,pub_date__month=7,pub_date__day=12)
#只查某月
models.Book.objects.fliter(pub_date__month=7) #查询某个字段为空的数据
models.Book.objects.filter(title__isnull=True)#正规的
models.Book.objects.filter(title=None)

查看某个orm语句的原生sql语句方法

      print(models.Book.objects.filter(title__isnull=True).query)
原生sql语句如下
SELECT `app01_book`.`id`, `app01_book`.`title`,
`app01_book`.`state`, `app01_book`.`price`,
`app01_book`.`price2`, `app01_book`.`pub_date`,
`app01_book`.`title2`, `app01_book`.`publish` FROM `app01_book`
WHERE `app01_book`.`title2` IS NULL

distinct注意点

      class Book(models.Model):
id = models.AutoField(primary_key=True) #自动,主键
...
publish = models.CharField(max_length=32) def __str__(self):
return self.title +'价格' +str(self.price) def Meta:
ordering=['id','publish',] #views.py文件内容如下
#models.py文件中制定了规则,此时用去重就不生效了
obj_list = models.Book.objects.all().values('price2').distinct()
print(obj_list)
#打印结果<QuerySet [{'price2': 100}, {'price2': 200}, {'price2': 300}, {'price2': 200}, {'price2': 100}, {'price2':100}, {'price2':200}]>
#配合order_by自定义规则 此时会去重
obj_list = models.Book.objects.all().order_by('price2').values('price2').distinct()
print(obj_list)#<QuerySet [{'price2': 100}, {'price2': 200},{'price2': 300}]>
#当模型类中制定了默认排序字段,那么当我们使用distinct方法进行去重时,默认会按照我们指定的排序字典进行去重,会导致去重结果不是我们想要的,所以要么我们在模型类中不指定排序字段,如果制定了排序字段,我们在使用distinct方法前面加上order_by方法,并且order_by方法中的字段就是我们要去重的字段数据

字段的choices属性

      class Book(models.Model):
...
#sex = models.CharField(max_length=12)
sex_choices = ((1,'男性'),(0,'女性'))#enum枚举 单选
sex = models.IntegerField(choices=sex_choices,default=1) views.py文件内容
获取含有choices属性的字典数据方法
ret = models.Book.objects.get(id=5)
print(ret.sex) #1 获取到的是数据库中存储的字段数据
print(ret.get_sex_display()) #男性,能够帮我们获取到该字段数据对应的choices指定的元组中的这个数据对应的文本内容 # sex_choices = ((1, '男性'), (0, '女性')) # enum枚举 单选
# sex = models.IntegerField(choices=sex_choices, default=1)
# 比如拿sex这个字段来说,数据库中存的数据是1,表示男性,如果我想获取到男性这个字符串数据,我直接通过模型类对象.get_sex_display()这个方法就能获取到,这个方法的语法是get_模型类属性名称_display()

auto_now_add和auto_now

      使用
class ShowTime(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
brithday = models.DateTimeField(auto_now_add=True)#添加记录时,自动添加创建时间
bday = models.DateTimeField(auto_now=True)#添加记录时,也能自动添加创建时间,并且更新记录时,自动更新为当前时间 操作:
models.DateTimeField(auto_now=True)中的auto_now=True对update方法没有效果
models.ShowTime.object.all().update(
name='liu',
) auto_now=True只有在使用save方法来进行更新动作时,才生效,才会自动更新修改时间
ret = models.ShowTime.objects.get(id=1)
ret.name='liu'
ret.save()

url反向解析

  • 由于将来项目中的不同功能对应的url路径可能会发生变化,所以我们在每个url路径上加上一个别名,将来通过别名反向解析来使用这个别名对应的路径,那么不管路径将来发生什么变化,只要别名不变,那么逻辑中使用这个路径的地方,都可以通过别名获取到

别名的使用

      urlpatterns=[
...
url(r'^add_book/',views.add_book,name='add_book'),#name属性对应的值,就是这个路径的别名
]

views视图中使用url反向解析的方法

      首先在视图中引入反向解析的方法
from django.urls import reverse #url别名反向解析,通过name别名对应的数据,解析出我们的url路径
1.针对没有参数的别名
url(r'^add_book/',views.add_book,name='add_book')
反向解析:reverse('book_list')
2.针对含有无名分组的url
url(r'^book_list/v2/(\d+)/(\d+)',views.book_list,name='book_list')
反向解析:reverse('book_list',args=(11,12))
3.针对含有有名分组的url
url(r'^book_list/v2/(?P<year>\d+)/(?P<month>\d+)/',views.book_list,name='book_list')
反向解析:reverse('book_list',kwargs={'year':2012,'month':7})

html文件中使用url别名反向解析

      1.针对无参数的路径:
url(r'^add_book',views.add_book,name='add_book')
反向解析:<a href="{% url 'add_book' %}">添加</a>
2.针对有参数的路径:有名和无名
url(r'^add_book/(\d+)/(\d+)/',views.add_book,name='add_book')
url(r'^add_book/(?P<year>\d+)/(?P<month>\d+)/',views.add_book,name='add_book')
反向解析:<a href="{% url 'add_book' 参数1 参数2 %}">添加</a>

写作业时注意的点

      数据库中存储的日期,要在页面中input标签中显示原数据必须用过滤器date:'Y-m-d'
<input type="date" class="form-control" id="book_pub_date" placeholder="出版日期" name="book_pub_date" value="{{ edit_obj.pub_date|date:'Y-m-d' }}">,type='date'的input标签,value的值必须是'Y-m-d'的格式,这个标签才能认识并被赋值,所以,要通过date过滤给它改变格式。

orm多表操作

表关系介绍

  • ER图,实体关系图,navicat和powdesigner工具可以研究下

  • 多表图创建

      from django.db import models
class Author(models.Model):
#作者表
id = models.AutoField(primary_key=True)#其实模型类中的id主键字段不需要我们手动指定,django的orm默认会给每张表都添加一个id字典并且为主键,如果我们自己指定了主键,以我们自己指定的为准,就不会自动帮你添加主键字段了
name = models.CharField(max_length=32)
age = models.IntegerField()
#关联外键完整写法
#ad = models.ForeignKey(to='AuthorDetail',to_field='id',on_delete=models.CASCADE)
#简写可以不写to=,不写to_field='id'
#ad = models.ForeignKey('AuthorDetail',on_delete=models.CASCADE)#只是单纯的外键关系,需要手动指定唯一约束才可以,在orm中提供了一对一关系的类,叫作OneToOneField.
ad = models.OneToOneField('AuthorDetail') #foreign+unique 外键+约束
#books = models.ManyToManyField('Book') #models.ForeignKey(AuthorDetail)这里面的外键关联的表,可以不写引号,但是如果不写引号,那么这个外键关键的表必须写在这个外键字典的表上面,一般我们都写上引号,这样就不用考虑哪个表写在上面,哪个表写在下面了
#ad = models.ForeignKey(AuthorDetail,on_delete=models.CASCADE)
#第一个to=可以用写,to_field='id'也可以不用写,自动找到是to=那张表的id字段
#django 1.11版本的foreignKey 默认有on_delete=models.CASCADE这个属性,所以如果要做这种级联删除模式,可以不用写这个属性,但是django2.0之后,必须要自己手动加上这个属性 #关于联级()
models.CASCADE 联级删除;#没办法设置联级更新,要做联级更新,自己通过原生sql去加上,就是修改表 class AuthorDetail(models.Model):
#作者详细信息表
birthday = models.DateFiedl()
telephone = models.CharField(max_length=24)
#通过手机号查找默认 手机号151开头 class Publish(models.Model):
name = models.CharField(max_length=64)
city = models.CharField(max_length=64) class Book(models.Model):
title = models.CharField(max_length=64)
pub_date = models.DateField()
price = models.DecimalField(max_digits=10,decimal_places=2)
pub = models.ForeignKey('Publish')
#ForeignKey这个类,生成数据库字段的时候,会自动将该属性名称_id作为我们的数据库字段名称
authors = models.ManyToManyField('Author')
#authors在执行数据库同步指令之后,不会生成字段,而是会帮我们生成一个第三张表,这个表就是书籍表和作者表的多对多关系表 生成的第三表book_authors表

django学习第六天---shell指令,单表基于双下划线的模糊查询,distinct注意点,字段的choices属性,url反向解析,orm多表操作创建表的更多相关文章

  1. Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql

    0 图书相关表关系建立 1.5个表 2.书籍表,作者表,作者详情表(垂直分表),出版社表,书籍和作者表(多对多关系) 一对一 多对多 本质都是一对多 外键关系 3.一对一的关系,关联字段可以写在任意一 ...

  2. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

  3. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

  4. $Django 模板层(模板导入,继承)、 单表*详(增删改查,基于双下划线的查询)、static之静态文件配置

    0在python脚本中使用django环境 import osif __name__ == '__main__':    os.environ.setdefault("DJANGO_SETT ...

  5. Django Mysql数据库-基于双下划线的跨表查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  6. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  7. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  8. Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  9. django orm 基于双下划线的跨表查询

    一..基于双下划线的跨表查询(join实现) key:正向查询按字段,反向查询按表明小写 1.一对多跨表查询 查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询 ...

  10. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

随机推荐

  1. [转帖]初识SkyWalking

    https://zhuanlan.zhihu.com/p/361579294 一.SkyWalking 是什么? 一个开源的可观测平台,用于从服务和云原生基础设施收集,分析, 聚合及可视化数据. Sk ...

  2. [转帖]Redis子进程开销与优化

    Redis子进程开销与优化 文章系转载,便于分类和归纳,源文地址:https://blog.csdn.net/y532798113/article/details/106870299 1.CPU 开销 ...

  3. [转帖]gdb进阶调试技巧

    https://www.jianshu.com/p/9bdaa0644dba 整理一下在linux下C/C++用gdb工具debug一些提高效率的操作.基本的gdb操作就不在这里赘述了. 打印各种变量 ...

  4. 【码农教程】手把手教你学会Mockito使用

    作者:京东零售 秦浩然 一.前期准备- 1.准备工作 <!--mockito依赖--> <dependency> <groupId>org.mockito</ ...

  5. Mygin实现中间件Middleware

    本篇是mygin的第六篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现. 目的 实现中间件Middleware ...

  6. 深入学习C#系列文章01---C#3 革新写代码的新方式

    C#3 几乎所有的新特性都是为LINQ服务的,但他们单独使用也非常有用,接下来我们来简单看看C#3 的几个新特性吧. 一.自动实现的属性-----编写由字段直接支持的简单属性,不再显得臃肿不堪. 之前 ...

  7. Govulncheck v1.0.0 发布了!

    原文在这里 原文作者:Julie Qiu, for the Go security team 发布于 13 July 2023 我们很高兴地宣布,govulncheck v1.0.0 已经发布,同时还 ...

  8. [3] 以逆向的角度来看循环语句——do、while、for的比较

    [3] 以逆向的角度来看循环语句--do.while.for的比较 1. do循环 ​ 先执行循环体,后比较判断 #include <stdio.h> int main(int argc, ...

  9. 普及100Hz高刷+1ms响应 微星发布27寸显示器:仅售799元

    不论办公还是游戏,高刷及低响应时间都很重要,微星现在推出了一款27寸显示器PRO MP273A,售价只有799元,但支持100Hz高刷.1ms响应时间,还有FreeSync技术减少撕裂. PRO MP ...

  10. Kubernetes:kube-scheduler 源码分析

    0. 前言 [译] kubernetes:kube-scheduler 调度器代码结构概述 介绍了 kube-scheduler 的代码结构.本文围绕代码结构,从源码角度出发,分析 kube-sche ...