Django笔记(五)
重定向
- 什么是重定向
- 向新的访问地址发送请求(服务器端)
- 语法
from djangp.htmmp import HttpResponseRedirect
return HttpResponseRedirect(url)
ORM操作
- 将数据表中所有人的年龄都增加10岁
update index_author set age=age+10
Author.objects.all().update(age=10)
F()操作
- 取出某个字段的值再做操作
- 例如
- 浏览量自增
- 所有人的年龄都增加10岁
- 作用
- 在执行操作中,获取某列的值时使用
- 语法
- F(‘列名’)
- 导入
from django.db.models import F
- 使用
Author.objects.all().update(age=F('age')+10)
- 注意:
- F必须用于某个操作中
- 脱离操作F无法使用
实战案例源码
from django.db.models import F # 作者列表 def authorList(request): # authors = Author.objects.all() # authors = Author.objects.filter(isActive=True) # 所有人的年龄都增加10岁 Author.objects.all().update(age=F('age') + 10) authors = Author.objects.filter(isActive__exact=True) return render(request, 'authorList.html', { 'authors': authors, })
Q()操作
Author.objects.filter(id=1,age=35)
且操作- 那么或操作如何处理呢,这个时候就需要用到Q()了
- 作用
- 在查询条件中,可以完成或(or)的操作
- 语法
from django.db.models import Q
- Q(表达式)|Q(表达式)
- 案例
- 查询作者表中id=3或者年龄大于等于70的信息
Author.objects.filter(Q(id__exact=3)|Q(age__gt=70))
select *from index_author where id=3 or age>=70
实战案例源码
# 作者列表
def authorList(request): # authors = Author.objects.all() # authors = Author.objects.filter(isActive=True) # 所有人的年龄都增加10岁 # Author.objects.all().update(age=F('age') + 10) # 查询id=3 或年龄大于等于80岁的人 authors = Author.objects.filter(Q(id__exact=3) | Q(age__gt=80), isActive__exact=True) # authors = Author.objects.filter(isActive__exact=True) return render(request, 'authorList.html', { 'authors': authors, })
原生的数据库操作方法
- 主要分两个方法
- 查询
- 增删改
查询
- 函数
- raw(原生sql语句)
- 语法
- Entry.objects.raw(sql)
- 返回
- 返回的是列表嵌套对象的数据集
原生sql语句实战案例源码
# 作者列表
def authorList(request): # authors = Author.objects.all() # authors = Author.objects.filter(isActive=True) # 所有人的年龄都增加10岁 # Author.objects.all().update(age=F('age') + 10) # 查询id=3 或年龄大于等于80岁的人 # authors = Author.objects.filter(Q(id__exact=3) | Q(age__gt=80), isActive__exact=True) # 原生sql语句查询 authors=Author.objects.raw('select *from index_author') # authors = Author.objects.filter(isActive__exact=True) return render(request, 'authorList.html', { 'authors': authors, })
增删改的方法
with connection.cursor() as cursor
sql='delete from author whe id=1'
cursor.execute(sql)
return HttpResponse("...")
实战案例源码
# 原生的增删改查询# from django.db.models import connection# with connection.cursor() as cursor:# sql='....' # cursor.execute(sql)
使用后台管理Models
- 后台的配置
- 登录地址 : 主路由/admin
- 创建后台管理员
python manage.py createsuperuser
- 组
- 权限管理的分组
基本管理
- 在应用中的admin.py中注册要管理的实体类
- admin.py
- 作用
- 注册需要管理的models
- 只有再次注册的models才允许被管理
- 注册models
- 导入模型
from .models import Author,Publisher,Book
- 注册模型
admin.site.register(Author)
- 一条语句只能注册一个模型
- 要注册多个模型需要分多次注册
- 导入模型
注册管理模型实战案例源码
from django.contrib import admin
from .models import Author, Publisher, Book # Register your models here. admin.site.register(Author) admin.site.register(Book) admin.site.register(Publisher)
修改models.py处理显示内容
- 在models.py中为各个class追加
def __str__(self):retur self "当前类的主要属性名"
实战案例源码
# 出版社
class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=20) city = models.CharField(max_length=20) country = models.CharField(max_length=20) website = models.URLField() def __str__(self): return self.name # 作者 Author:name age email class Author(models.Model): name = models.CharField(max_length=32) age = models.PositiveSmallIntegerField() email = models.EmailField(null=True) # 增加一个状态列,来表示用户是启用的还是禁用的 isActive = models.BooleanField(default=True) def __str__(self): return self.name # 图书 Book:title publicate_date class Book(models.Model): title = models.CharField(max_length=32) publicate_date = models.DateField(auto_now=True) def __str__(self): return self.title
通过models类的内部类Meta定义每个类的展现形式
class Author(models.Model): ... class Meta: #常用的属性 db_table = '作者' #指定改实体类对应到的表的名称 verbose_name= '作者' #定义该实体类在后台管理的列表页中的名称(单数形式) # 修改后台表名用以下一个属性即可 verbose_name_plural=verbose_name #效果同上,但是是复数形式 ordering= #指定实体数据列表页中的排序规则 quzh,默认升序,降序添加负号
修改后台管理显示表名实战案例源码
# 出版社
class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name='出版社名称') address = models.CharField(max_length=20, verbose_name='地址') city = models.CharField(max_length=20, verbose_name='所在城市') country = models.CharField(max_length=20, verbose_name='所在国家') website = models.URLField(verbose_name='官网') def __str__(self): return self.name class Meta: verbose_name_plural = '出版社' ordering = ['city', 'name'] # 作者 Author:name age email class Author(models.Model): name = models.CharField(max_length=32, verbose_name='姓名') age = models.PositiveSmallIntegerField(verbose_name='年龄') email = models.EmailField(null=True, verbose_name='邮箱') # 增加一个状态列,来表示用户是启用的还是禁用的 isActive = models.BooleanField(default=True) def __str__(self): return self.name class Meta: verbose_name_plural = '作者' # 排序 年龄降序 id升序 ordering = ['-age', 'id'] # 图书 Book:title publicate_date class Book(models.Model): title = models.CharField(max_length=32, verbose_name='书名') publicate_date = models.DateField(auto_now=True, verbose_name='出版日期') def __str__(self): return self.title class Meta: verbose_name_plural = '图书' ordering = ['-publicate_date', 'title']
高级管理
- 在admin.py中创建高级管理类
- 定义EntryAdmin,继承自admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
- 注册高级管理类
admin.site.register(Author,AuthorAdmin)
ModelAdmin的所有属性(摘录自Django源码)
class ModelAdmin(BaseModelAdmin): "Encapsulates all admin options and functionality for a given model." list_display = ('__str__',)#要显示的字段 list_display_links = ()#要设置为链接的字段 list_filter = ()#过滤的字段 list_select_related = False list_per_page = 100 list_max_show_all = 200 list_editable = () search_fields = () date_hierarchy = None save_as = False save_as_continue = True save_on_top = False paginator = Paginator preserve_filters = True inlines = [] # Custom templates (designed to be over-ridden in subclasses) add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None popup_response_template = None # Actions actions = [] action_form = helpers.ActionForm actions_on_top = True actions_on_bottom = False actions_selection_counter = True checks_class = ModelAdminChecks
定制高级管理信息
- list_display
- 作用
- 指定在列表页中能够显示的字段
- 参数
- 元组
list_display = ('name', 'age', 'email')
- 列表
list_display = ['name', 'age', 'email']
- 两种方式的显示效果在后台完全一样
- list_display_links
- 作用
- 指定在列表中能够连接到详情页的字段们
- 参数
- 由属性名称组成的元组或列表
- 必须出现在list_display的取值中
list_display_links = ['name', 'age', 'email']
- list_editable
- 作用
- 指定在列表页中就允许被编辑的字段们
- 参数
- 取值不能出现在list_display_links中
- 但是必须出现在list_display中
list_editable = ['age', 'email']
- search_fields
- 作用
- 添加允许被搜索的字段们
- 参数
- 元组
- 列表
- 案例
search_fields = ['name', 'age', 'email']
- list_filter
- 作用
- 在列表的右侧过滤器实现快速筛选
- 参数
- 元组
- 列表
- 案例
list_filter = ['age']
- date_hierarchy
- 作用
- 在列表页的上方增加一个时间选择器
- 可以根据时间实现快速筛选
- 参数
- DateField
- DateTimeField
- 案例
date_hierarchy = 'publicate_date'
- fields
- 作用
- 在详情页面中指定显示哪些字段,并按照什么样的顺序显示
- 当只希望部分字段允许被修改的时候可用
- 取值
- 元组
- 列表
- 案例
fields = ('name', 'city')
- fieldsets
- 作用
- 在详情页中,对字段们进行分组显示
- 注意
- fieldsets和fields是不能共存的
- 语法
- fieldsets=((字段1,字段2),(字段3,字段4…))
分组案例实战源码
class PulisherAdmin(admin.ModelAdmin): # fields = ('name', 'city') fieldsets = ( ('分组1', {'fields': ('name', 'city'), 'classes': ('collapse',)}), ('分组2', {'fields': ('country', 'website')})) list_display = ['name', 'city', 'country', 'website']
关系映射
- 一对一映射
- 一对多映射
- 多对多映射
一对一映射
- 什么是一对一
- A表中的一条记录只能与B表中的一条记录相关联
- 案例
- 作者和作者详情
- 图书和图书详情
- 博客和博客详情
- 数据库中实现
- A表:设置主键
- B表:增加一列,并引用自A表的主键,增加一个唯一约束unique
- 语法
- 在关联的两个表中的任何一个类中增加
- 属性=models.OneToOneField(Entry)
- 报错问题
- 添加外键不给默认值会报错
- 处理方法一般有两种
- 1 删除原本的数据
- 2 将外键设置的一个default值或者null=True
- 查询
- 正向查询:通过wife找author
wife=wife.objects.get(id=1)
author=wife.author
- 反向查询:通过author找wife
- 技巧
类名小写__
author=Author.objects.get(id=3)
wife=author.wife
- wife是Django通过OneToOneField在Author中默认增加的一个隐式属性
- 看不到
- 不用自己写
- 但是可以调用
正向查询作者妻子实战源码
# 查询作者妻子
def authorWife(request): #正向查询 author = Author.objects.get(id=2) wife = author.wife l = ["妻子名字:{}".format(wife.name)] return HttpResponse(l)
反向查询妻子老公实战源码
# 查询作者妻子
def authorWife(request): # 正向查询 author = Author.objects.get(id=2) wife = author.wife l = ["妻子名字:{}".format(wife.name)] # 反向查询 wife = Wife.objects.get(id=3) author = wife.author l.append( '<br>老公名字:{}'.format(author.name)) return HttpResponse(l)
转载于:https://www.cnblogs.com/gao_x/p/10509384.html
Django笔记(五)相关推荐
- Django笔记总结
1.web框架的本质 web通信流程 web我们这里指的就是通过浏览器去访问服务端,请求页面或者数据的通信方式,属于B/S架构.就是我们常见的网站.浏览器与服务端的通信流程:浏览器客户端发送一个请求信 ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
- Ethernet/IP 学习笔记五
Ethernet/IP 学习笔记五 Accessing data within a device using a non-time critical message (an explicit mess ...
- Django 笔记6 -- 多表查询
Django 笔记6 – 多表查询 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Djang ...
- Django 笔记5 -- 数据库
Django 笔记5 – 数据库 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django ...
- Django 笔记4 -- 模板
Django 笔记4 – 模板 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django官 ...
- Django 笔记3 -- URL
Django 笔记3 – URL Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django ...
- Django 笔记2 -- Django 项目
Django 笔记2 – Django 入门 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: ...
- Django 笔记1 -- 环境搭建
Django 笔记1 – 环境搭建 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Djang ...
- StackExchange.Redis学习笔记(五) 发布和订阅
StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...
最新文章
- 【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
- Install Odoo 11 on CentOS 7
- Java数组,Wat!
- Git常用指令及功能总结
- Python程序员30行代码素描表白!网友:花里胡哨
- 安装chrome_Chrome 离线安装包下载
- SentinelResource注解配置中_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0046
- sap 发送mesage_SAP系统和微信集成的系列教程之九:如何将微信用户发送给微信公众号的内容自动转存到SAP C4C系统...
- luoguP3507 [POI2010]GRA 性质 + 动态规划
- Find n‘th number in a number system with only 3 and 4
- Buddy分配器之释放一页
- Redfish协议测试工具–Postman
- Reflect的理解
- 卖D版的抢Z版的钱,卖Z版的抢我的钱,都是流氓,我向着谁?
- 技术分享| 小程序实现音视频通话
- 算符优先系列之(二)算符优先关系表
- 信号的扩展是因果_信号与系统 怎么判断e(1-t)的时不变和因果性?
- sql monitor简介
- 3个结点的树和有3个结点的二叉树的所有不同的形态
- 地图对接汇总(百度地图)
热门文章
- 微软起诉TomTom,Linux牵扯其中
- Cross-Scale Cost Aggregation for Stereo Matching立体匹配算法介绍
- 系统架构设计师论文范文-论基于DSSA的软件架构设计与应用
- 删除Mac上的UPedit
- 在计算机窗口中什么中的文件不能被删除,在Windows操作系统中,“回收站”可以恢复(1)上使用键删除的文件或文件夹。在“我的电脑”窗口中,...
- linux屏幕拷贝,使用gnome-screenshot在Linux中截取屏幕截图的综合指南
- PHP单页面加密视频教程附源码,thinkphp3.2最新版本项目实战视频教程(含源码)
- google play 已停止运行,com.google.process.gapps已停止运行问题的解决办法
- 地图着色问题javaScript版-- 《算法分析与设计》课程设计题目
- 淘宝直播间互动工具,自动回复助手,匹配关键词回复指定内容