python django框架orm_Python全栈 Web(Django框架、后台管理,ORM关系)
F查询和Q查询:
F()
在之执行中获取某字段的值
F("字段名")
将所有人的年龄加10
form django.db.models import F
Author.objects.all().update(age=F("age")+10)
def doF_views(request):
Author.objects.all().update(age=F('age')+10)
return redirect('/07-queryall')
Q()
在查询条件中可以完成or操作
Q(条件)|Q(条件)
查询所有id为1或年龄为48的人的信息
form django.db.models import Q
Author.objects.filter(Q(id=1)|Q(age=48))
authors = Author.objects.filter(Q(age=30|Q(id__gt=20)))
原生的数据库操作方法:
查询:
函数:raw(sql)
Entry.objects.raw(sql)
返回值:QuerySet
增删改:
from django.db import connection
with connection.cursor() as cursor
sql = "delete from ..."
cursor.execute(sql)
return ""
def raw_views(request):
sql = "select * from index_author where age>45"
authors = Author.objects.raw(sql)
for au in authors:
print(au.name,au.age,au.email)
return HttpResponse("Query OK")
使用后台管理 models
创建后台管理员
./manage.py createsuperuser
username:输入用户名 如果不写默认为系统名称
email Address:电子邮件
Password:密码
Password(agian):重复密码
基本管理:
在应用中的admin.py中注册要管理的数据
1.admin.py
注册需管理的models类 只有在此注册的models类才允许被管理
2.注册models
from .models import *
admin.site.register(Entry)
通过models类的内部类 meta 来定义展现形式
class Author(models.Model):
...
...
class Meta:
db_table
指定实体类映射到表的名字
(该属性设置完成后会同步到数据库)
verbose_name
定义实体类在admin中现显示的名字(单数)
verbose_name_plural
定义实体类在admin中显示的名字(复数)
#创建 Author 的实体类
#1.name - 姓名(CharField -> varchar)
#2.age - 年龄(IntegerField -> int)
#3.email - 电子邮件(EmailField -> varchar)
class Author(models.Model):
name = models.CharField(max_length=30,verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
email = models.EmailField(null=True,verbose_name='邮件')
#表示用户的激活状态:True,表示已激活,False,表示未激活
#由于是新增列,所以必须要给默认值或允许为空
#由于BooleanField默认是不允许为空的,所以此处选择了增加默认值
isActive = models.BooleanField(default=True,verbose_name='激活用户')
#增加一个字段,表示用户的头像,可以上传的
picture = models.ImageField(upload_to="static/upload",null=True,verbose_name='头像')
# 重写 __str__ ,来定义该对象的字符串表示
def __str__(self):
return self.name
#增加内部类Meta来定义其展现形式
class Meta:
#1.修改表名为author
db_table = 'author'
#2.指定后台管理时要显示的名字
verbose_name = '作者'
verbose_name_plural = verbose_name
#3.指定排序规则
ordering = ['-age']
def __repr__(self):
return "" % self.name
高级管理:
在admin.py中创建高级管理类并注册
定义EntryAdmin 类 继承admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
pass
注册高级管理类
admin.site.register(Entry, EntryAdmin)
允许在EntryAdmin中增加属性
list_display
定义在列表页上显示的字段们
取值:
由属性名组成的元组或列表
list_display_links
定义在列表页也能链接到详情页的字段们
取值:
同上
这里的取值必须要出现在list_display中
list_editable
定义在列表页中允许被修改的字段们
取值:
同上
必须出现在list_display中 但是不能出现在list_display_links中
search_fields
添加允许搜索的字段们
取值 同上
list_filter
列表页的右测增加过滤器 实现快速筛选
date_hierarchy
列表页的顶部增加时间选择器
DateField 或 DateTimeField的列名
fields
在详情页中 指定显示那些字段 并按照什么样式的顺序显示
取值:
由属性名组成的列表或元组
fieldsets
在详情页面中 对字段们进行分组显示的
fieldsets 与 fields不能共存
取值:
fieldsets = [
# 分组1
("分组名称", {
"fields":("属性1", "属性2")
"classes": ("collapse")
}),
# 分组2
(),
]
from django.contrib import admin
from .models import *
#声明高级管理类
class AuthorAdmin(admin.ModelAdmin):
#指定在列表页中显示的字段们
list_display = ('name','age','email')
#指定能够连接到详情页的字段们
list_display_links = ('name','email')
#指定在列表页中就允许被修改的字段们
list_editable = ('age',)
#指定条件的搜索字段们
search_fields = ('name','email')
#指定右侧过滤器
list_filter=('name',)
#指定显示的字段以及显示的顺序
# fields = ('name','isActive','email')
#指定显示的字段分组
fieldsets = (
#分组1
('基本信息',{
'fields':('name','email'),
}),
#分组2
('可选信息',{
'fields':('age','isActive','picture'),
'classes':('collapse',),
})
)
class BookAdmin(admin.ModelAdmin):
#指定时间选择器
date_hierarchy = "publicate_date"
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','address','city','website')
list_editable = ('address','city')
list_filter = ('address','city')
search_fields = ('name','website')
fieldsets = (
('基本选项',{
'fields':('name','address','city'),
}),
(
'高级选项',{
'fields':('country','website'),
'classes':('collapse',)
}
)
)
# Register your models here.
# 注册高级管理类
admin.site.register(Author,AuthorAdmin)
admin.site.register(Publisher,PublisherAdmin)
admin.site.register(Book,BookAdmin)
# 注册普通管理类
admin.site.register(Wife)
关系映射:
一对一的关系映射
语法:
在关联的连个类的任何一个中增加
属性 = models.OneToOneField(Entry)
class Author(models.Model):
....
class Wife(models.Model);
....
# 增加对Author的一对一引用
author = models.OneToOneField(Author)
# 在数据库中生成一个外键列在wife表中 要引用自author 表中的主键
# 在Author模型中也会增加一个隐式属性叫wife
#引用Author,实现一对一映射
author = models.OneToOneField(Author,verbose_name='相公')
查询:
正向查询:
直接通过关联属性就能获取到关联数据
通过wife找author
wife = Wife.objects.get(id=1)
author = wife.author
反向查询:
通过反向引用属性查询
通过author找wife
author = Author.objects.get(id=1)
# 反向引用的属性就是模型类的全小写
wife = author.wife
#正向查询
wife = Wife.objects.get(id=1)
wife_author = wife.author
#反向查询
author = Author.objects.get(id=1)
author_wife = author.wife
return render(request,'14-oto.html',locals())
一对多关系映射:
语法:
在"多"的模型中对"一"的模型引用
属性 = models.ForeignKey(Entry)
class Publisher(models.Model):
....
class Book(models.Model):
....
publisher = modelsForeignKey(Publisher)
#增加对Publisher的引用(1:M)
publisher = models.ForeignKey(Publisher,null=True)
查询:
正向查询:
book = Book.objects.get(id=1)
publisher = book.publisher
反向查询:
django 会默认在publisher中增加book_set属性 来表示对应的所有书籍的查询对象
publisher = Publisher.objects.get(id=1)
publisher = publisher.book_set.all()
def otm_views(request):
# 正向查询:通过Book查询Publisher,在15-otm.html中显示每个book对应的publisher
books = Book.objects.all()
# 反向查询
pub = Publisher.objects.get(id=1)
pub_books = pub.book_set.all()
return render(request,'15-otm.html',locals())
多对多关系映射:
语法:
在关联地 任意一个类中都可以增加
属性 = models.ManyToManyField(Entry)
class Author(models.Model):
....
class Book(models.Model):
....
authors = models.ManyToManyField(Author)
#增加对Author的引用(M:N)
authors = models.ManyToManyField(Author)
查询:
正向查询;
通过Book查询Author
authors 属性只是提供了关联表的查询引用 还需要使用all() values()等方法来获取真实的数据
def mtm_views(request):
#正向查询:通过 book 查询 authors
book = Book.objects.get(id=1)
authors = book.authors.all()
#反向查询:通过 author 查询 book
author = Author.objects.get(id=2)
books = author.book_set.all()
return render(request,'16-mtm.html',locals())
python django框架orm_Python全栈 Web(Django框架、后台管理,ORM关系)相关推荐
- 西游之路——python全栈——报障系统之后台管理
一.后台管理页面布局 1.用户: - 普通用户 知识库+提交报账单+个人信息 - 管理员 知识库+提交报账单+个人信息+处理报账单 - 超级管理员 知识库+提交报账单+个人信息+处理报账单+报障统计信 ...
- 我的第一个全栈 Web 应用程序
在这篇文章,作者将使用 React.js 和 Redux.js 前端技术,并通过调用 Ruby on Rails API,手把手教会你如何创建一个完美的全栈 Web 应用程序. 作者 | Anne-L ...
- 我的第一个web_登陆我的第一个全栈Web开发人员职位
我的第一个web by Robert Cooper 罗伯特·库珀(Robert Cooper) 登陆我的第一个全栈Web开发人员职位 (Landing My First Full Stack Web ...
- 从零开始开发一个全栈Web应用实录
虽说学习了大半年前端,但是对前端的理解仍然停留在对HTML,CSS,JS,JQuery的概念理解上,并且没有接触过相关的后端开发,所以说,这个项目也可称为从零开始,是新手向的文章,不要害怕有门槛哈. ...
- python+selenium基于po模式的web自动化测试框架
目录:导读 一.什么是Selenium? 二.自动化测试框架 三.自动化框架的设计和实现 四.需要改进的模块 五.总结 一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具, ...
- [See How]全栈Node TS框架TSRPC实践教程(一)
博客和公众号 此文已同步到因卓诶博客,请大家关注同名公众号 [See How]全栈Node TS框架TSRPC实践教程(一)www.yinzhuoei.com 前言 某个普通的一天的早晨,水友群的小 ...
- Axure经典案例高保真交互下载(数据统计图高保真原型+雷达图+条形图+折线图+web端通用后台管理原型+统计表、统计分析+用户画像分析)
Axure原型作品内容包括:数据统计图高保真原型+雷达图+条形图+折线图+web端通用后台管理原型+统计表.统计分析+用户画像分析+认证监控预警 以下是Axure部分作品图片截图展示,想看交互效果的请 ...
- python学习(三):web网页框架Django,成就python全栈开发
1.Django安装 框架很完美,组件非常多,但文件太多,过于臃肿(1.. Django是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计.· 由经验丰富的开发人员构建,它负责We ...
- python全栈生鲜电商_Python前后端分离开发Vue+Django REST framework全栈打造生鲜电商项目...
vue项目采用当前流行的前后端分离式开发技术,涉及RESTFul API基础知识和Vue项目结构分析,解决了技术开发单一的痛点,拥有超前的技术融合技能,让你在开发的领域比别人技高一筹! 1.项目初始化 ...
最新文章
- 句法分析常用算法框架以及NLPIR、Dependency Viwer
- 学生信息管理C语言 密码,求学生信息管理系统C语言版
- python百度手势识别_【百度大脑新品体验】手势识别
- php盒子模型,CSS盒子模型介绍
- linux 传真 邮件,如何在Linux环境下架设一台传真服务器(2)
- 断路器操作机构分合闸线圈电流特征曲线特点
- C++ 内存对齐 及 引用是否真的节省内存的一点思考
- Kafka:常用命令
- 科普dip,dp,sp,dpi,ppi,px,Density
- 【Jetty】Jetty 的工作原理以及与 Tomcat 的比较
- IIS上部署网站问题总结
- discuz常用操作说明
- stolz定理考研能用吗_这些高数定理,2021二战考研租房的你千万别记混
- FDS学习笔记(一)FDS中的基本概念
- ktv点歌系统主界面java_欢迎进入MyKTV前后台点歌系统展示
- java多线程(超详细)
- 计算机网络的简单实验
- Holt-Winters:三次指数平滑算法
- MATLAB中 分数化简
- linux 误删除根分区的pv,如何安全的删除Linux LVM中的PV物理卷(硬盘或分区)(4)
热门文章
- Android Studio 基础知识总结(Spinning,button........)
- Linux OTG当串口、网口、U盘
- 字节跳动面试题(编程题)—平衡二叉树(思路+代码)—力扣110
- 智百威盘点机 速达盘点机 管家婆盘点机 药品盘点机 超市盘点机 数据采集器后台服务
- [dp]洛谷 P2331 最大子矩阵
- js逆向案例-rus4逻辑学习
- 软开关设计漫谈_硬件篇
- 【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)
- 云服务器和宽带的区别在哪?
- 一阶电路的时域分析 - 学习笔记