进击的Python【第二十章】

1、Django请求的生命周期
路由系统 -> 试图函数(获取模板+数据=》渲染) -> 字符串返回给用户

2、路由系统
/index/ -> 函数或类.as_view()
/detail/(\d+) -> 函数(参数) 或 类.as_view()(参数)
/detail/(?P<nid>\d+) -> 函数(参数) 或 类.as_view()(参数)
/detail/ -> include("app01.urls")
/detail/ name=‘a1‘ -> include("app01.urls")
- 视图中:reverse
- 模板中:{% url "a1" %}

3、视图
FBV:函数
def index(request,*args,**kwargs):
..

CBV:类
class Home(views.View):

def get(self,reqeust,*args,**kwargs):
..

获取用户请求中的数据:
request.POST.get
request.GET.get
reqeust.FILES.get()

# checkbox,
........getlist()

request.path_info

文件对象 = reqeust.FILES.get()
文件对象.name
文件对象.size
文件对象.chunks()

# <form 特殊的设置></form>

给用户返回数据:
render(request, "模板的文件的路径", {‘k1‘: [1,2,3,4],"k2": {‘name‘: ‘张扬‘,‘age‘: 73}})
redirect("URL")
HttpResponse(字符串)

4、模板语言

render(request, "模板的文件的路径", {‘obj‘: 1234, ‘k1‘: [1,2,3,4],"k2": {‘name‘: ‘张扬‘,‘age‘: 73}})

<html>

<body>
<h1> {{ obj }} </h1>
<h1> {{ k1.3 }} </h1>
<h1> {{ k2.name }} </h1>
{% for i in k1 %}
<p> {{ i }} </p>
{% endfor %}

{% for row in k2.keys %}
{{ row }}
{% endfor %}

{% for row in k2.values %}
{{ row }}
{% endfor %}

{% for k,v in k2.items %}
{{ k }} - {{v}}
{% endfor %}

</body>
</html>

5、ORM

a. 创建类和字段
class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)#字符长度

Python manage.py makemigrations
python manage.py migrate

# settings.py 注册APP

b. 操作


models.User.objects.create(name=‘qianxiaohu‘,age=18)
dic = {‘name‘: ‘xx‘, ‘age‘: 19}
models.User.objects.create(**dic)

obj = models.User(name=‘qianxiaohu‘,age=18)
obj.save()

models.User.objects.filter(id=1).delete()

models.User.objects.filter(id__gt=1).update(name=‘alex‘,age=84)
dic = {‘name‘: ‘xx‘, ‘age‘: 19}
models.User.objects.filter(id__gt=1).update(**dic)

models.User.objects.filter(id=1,name=‘root‘)
models.User.objects.filter(id__gt=1,name=‘root‘)
models.User.objects.filter(id__lt=1)
models.User.objects.filter(id__gte=1)
models.User.objects.filter(id__lte=1)

models.User.objects.filter(id=1,name=‘root‘)
dic = {‘name‘: ‘xx‘, ‘age__gt‘: 19}
models.User.objects.filter(**dic)

v1 = models.Business.objects.all()
# QuerySet ,内部元素都是对象

# QuerySet ,内部元素都是字典
v2 = models.Business.objects.all().values(‘id‘,‘caption‘)
# QuerySet ,内部元素都是元组
v3 = models.Business.objects.all().values_list(‘id‘,‘caption‘)

# 获取到的一个对象,如果不存在就报错
models.Business.objects.get(id=1)
对象或者None = models.Business.objects.filter(id=1).first()

外键:
v = models.Host.objects.filter(nid__gt=0)
v[0].b.caption ----> 通过.进行跨表

外键:
class UserType(models.Model):
caption = models.CharField(max_length=32)
id caption
# 1,普通用户
# 2,VIP用户
# 3, 游客

class User(models.Model):
age = models.IntergerFiled()
name = models.CharField(max_length=10)#字符长度
# user_type_id = models.IntergerFiled() # 约束,
user_type = models.ForeignKey("UserType",to_field=‘id‘) # 约束,

name age user_type_id
# 张扬 18 3
# 张A扬 18 2
# 张B扬 18 2

Ajax

$.ajax({
url: ‘/host‘,
type: "POST",
data: {‘k1‘: 123,‘k2‘: "root"},
success: function(data){
// data是服务器端返回的字符串
var obj = JSON.parse(data);
}
})

建议:永远让服务器端返回一个字典

return HttpResponse(json.dumps(字典))

多对多:
创建多对多:
方式一:自定义关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field=‘id‘)
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
# 2

class HostToApp(models.Model):
hobj = models.ForeignKey(to=‘Host‘,to_field=‘nid‘)
aobj = models.ForeignKey(to=‘Application‘,to_field=‘id‘)

# HostToApp.objects.create(hobj_id=1,aobj_id=2)

方式二:自动创建关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field=‘id‘)
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField("Host")

无法直接对第三张表进行操作

只有create和get操作可以赋值给变量

obj = models.Application.objects.create(name=app_name)

obj = Application.objects.get(id=1)
obj.name

# 第三张表操作
obj.r.add(1)
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])

obj.r.remove(1)
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])

#相关联的两个表如果修改,那么关系表会自动改变,不用专门清理
obj.r.clear()

obj.r.set([3,5,7])

# 所有相关的主机对象“列表” QuerySet
obj.r.all()

时间: 2024-10-08 12:30:52

进击的Python【第二十章】的相关文章

JavaScript高级程序设计:第二十章

第二十章 一.语法 JSON的语法可以表示以下三种类型的值: (1)简单值 (2)对象 JSON的对象与javascript字面量有一些不同.例如,在javascript中,前面的对象字面量可以写成下面这样: var  object = { “name” : “Nicholas” , “age” : 29 } ; JSON表示上述对象的方式如下: { “name” : “Nicholas” , “age” : 29 } 不同之处:首先,没有声明变量,其次,没有末尾的分号.最后,对象的属性必须加双

第二十章 内存等空间管理类的实现

                   第二十章   内存等空间管理类的实现      空间.时间对我来说,或许永远是一个迷.即使我曾经深入到原子的最深处,即使人类科学家是自欺欺人,即使我了解到的最深层次的部分真理是正确的:那又能怎样?那都是过去式,在那光明与黑暗一体之地.我的灵魂受伤了:我不得不回到电脑这块充满垃圾的地方修心养性. 或许我的论述方法不好,要完全理解本章是有点难度:你要对简单的空间概念需要一定的理解,即使只是论述1D的线性平面空间中的2个基本方法:分配与释放,但也很复杂.要知道LI

进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来

Python第二十二天 stat模块 os.chmod方法 os.stat方法

Python第二十二天   stat模块  os.chmod方法  os.stat方法 stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义,根据stat模块读取os.stat()中的值的意思简单来说,os.stat是将文件的相关属性读出来,然后用stat模块来处理 os.stat 返回一个stat 结果,结果类型是posix.stat_result stat(path) -> stat result 获取stat结果 st = os.stat('/tmp/aa.p

怒学Python——第二篇——类型与运算

Python支持5种数据类型,包括数字(numbers).字符串(string).列表(list).元组(tuple)和字典(dictionary).作为一门动态类型语言,不用去声明一个标示符的类型,使用的时候是什么类型会自动判定. 对于定义好的变量,若不使用该变量,可以用del删除来释放占有的资源,如 var = 10 del var Python的数字(numbers):支持int.long.float和complex,比较简单不给出示例. Python的字符串(string):如前面所说的

进击的Python【第十三章】:Web前端基础之HTML与CSS样式

进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n")

machine learn in python 第二章2.1.1

1关于 sklearn.datasets from sklearn.datasets import load_iris import numpy as np data = load_iris() data 的属性如下: 数据存储在.data项中 每个观察对象的种类存储在数据集的.target属性中 数据的特征的种类存储在数据集的.feature_names属性中. 2关于遍历问题 a:遍历不取item的序号i for item in sequence: process(item) b: for 

[Head First Python] - 第二章 python of comment

1- 多行注释 ''' ''' 或 """ """ '''this is the standard way to include a multiple-line comment in you code''' """this is the standard way to include a multiple-line comment in you code""" 2- 单行注释 # # t

学习 Python 第二课:用户交互程序

Author:uljfangbr/>E-mail:[email protected]Mentor:Liu YouyuanTime:2018-3-25 要求:1.用户输入相关信息2.打印出如下格式: ----------INFO: NAME ----------NAME:AGE:JOB:SALARY: #! usr/bin/env python #Author:uljfang #E-mail:[email protected] #Mentor:Liu Youyuan #Time:2018-3-25

“全栈2019”Java异常第二十章:自定义异常详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异常第二十章:自定义异常详解 下一章 "全栈2019"Java异常第二十一章:finally不被执行的情况 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学