yishishizi

  • 主页
  • 随笔
  • 归档
总文章数 21
所有文章 友链 关于我

yishishizi

  • 主页
  • 随笔
  • 归档

web项目开发流程

阅读数:次 2021-07-26

web项目开发流程

软件开发过程的划分

本规定对一个完整的开发过程按“软件过程改进方法和规范”把产品生命周期划分为 6 个阶段:

  • 产品概念阶段(记为 PH0)
  • 产品定义阶段(记为 PH1)
  • 产品开发阶段(记为 PH2)
  • 产品测试阶段(记为 PH3)
  • 用户验收阶段(记为 PH4)
  • 产品维护阶段(记为 PH5)

项目的需求分析、数据库设计及项目的架构设计

基于Django框架的项目搭建

目录架构

myobject/
    ├── manage.py
    ├── myobject
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── myadmin
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── views
    │   │   ├── __init__.py
    │   │   └── index.py
    │   ├── models.py
    │   ├── tests.py
    │   └── urls.py
    ├── web
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   ├── __init__.py
    │   ├── views
    │   │   ├── __init__.py
    │   │   └── index.py
    │   ├── models.py
    │   ├── tests.py
    │   └── urls.py
    ├── mobile
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   ├── __init__.py
    │   ├── views
    │   │   ├── __init__.py
    │   │   └── index.py
    │   ├── models.py
    │   ├── tests.py
    │   └── urls.py
    ├── static
    │   ├── myadmin/
    │   ├── web/
    │   ├── mobile/
    │   └── uploads/
    └── templates
        ├── myadmin/
        ├── web/
        └── mobile/

1、html导入模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
方式一:
{% block main_body %}
{% endblock %}

{% extends 'myadmin/base.html'%}

{% block main_body %}
<!-- Content Header (Page header) -->
<section class="content-header">
<h1>
首页
<small>订餐系统后台管理</small>
</h1>
<ol class="breadcrumb">
<li><a href="#"><i class="fa fa-dashboard"></i> Level</a></li>
<li class="active">Here</li>
</ol>
</section>

<!-- Main content -->
<section class="content container-fluid">

<!-- Small boxes (Stat box) -->
<div class="row">
<div class="col-lg-3 col-xs-6">
<!-- small box -->
<div class="small-box bg-aqua">
<div class="inner">
<h3>150</h3>

<p>新订单</p>
</div>
<div class="icon">
<i class="ion ion-bag"></i>
</div>
<a href="#" class="small-box-footer">更多信息 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-xs-6">
<!-- small box -->
<div class="small-box bg-green">
<div class="inner">
<h3>53<sup style="font-size: 20px">%</sup></h3>

<p>Bounce Rate</p>
</div>
<div class="icon">
<i class="ion ion-stats-bars"></i>
</div>
<a href="#" class="small-box-footer">更多信息 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-xs-6">
<!-- small box -->
<div class="small-box bg-yellow">
<div class="inner">
<h3>44</h3>

<p>用户注册</p>
</div>
<div class="icon">
<i class="ion ion-person-add"></i>
</div>
<a href="#" class="small-box-footer">更多信息 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-xs-6">
<!-- small box -->
<div class="small-box bg-red">
<div class="inner">
<h3>65</h3>

<p>Unique Visitors</p>
</div>
<div class="icon">
<i class="ion ion-pie-graph"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
</div>

</section>
<!-- /.content -->
{% endblock%}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
方式二:{% include "myapp/users/menu.html" %}
menu.html
<h2>用户信息管理</h2>
<a href="{% url 'indexusers' %}">浏览信息</a> |
<a href="{% url 'addusers' %}">添加信息</a>
<hr/>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息管理</title>
<script>
//自定义执行信息删除提示判断,参数uu是成功的删除url地址
function doDel(uu){
if (confirm("确定要删除吗?")){
//网页跳转
window.location=uu;
}
}
</script>
</head>
<body>
<center>
{% include "myapp/users/menu.html" %}

<h3>浏览用户信息</h3>
<table width="800" border="1">
<tr>
<th>ID号</th>
<th>姓名</th>
<th>年龄</th>
<th>电话</th>
<th>添加时间</th>
<th>操作</th>
</tr>
{% for user in userslist %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.age}}</td>
<td>{{user.phone}}</td>
<td>{{user.addtime}}</td>
<td>
<a href="{% url 'editusers' user.id %}">编辑</a>
<a href="javascript: doDel('{% url 'delusers' user.id %}');">删除</a>
</td>
</tr>
{% endfor %}
</table>
</center>
</body>
</html>

2、编辑后台浏览页面

1
2
3
4
5
6
7
8
9
10
11
12
13
# 员工信息管理的视图文件
from django.shortcuts import render
from django.http import HttpResponse
from django.core.paginator import Paginator
from myadmin.models import User
# Create your views here.

def index(request):
"""浏览信息"""
umod=User.objects
ulist=umod.filter(status__lte=9) #lte表示小于等于9,lt表示小于9
context={"userlist":ulist}
return render(request,"myadmin/user/index.html",context)

3、Q—对对象的复杂查询
Q对象是Django对model查询中所使用的关键字参数进行封装后的一个对象。

Q对象可以通过 &(与)、 |(或)、 ~(非)运算来组合生成不同的Q对象,便于在查询操作中灵活地运用。

1
2
3
4
5
6
7
8
9
10
11
from django.db.models import Q
# 并且条件:与条件查询
models.User.objects.filter(条件1,条件2,条件n..)
models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))

# 或者条件:或条件
models.User.objects.fliter(Q(username='老王') | Q(username='老李'))

# 取反条件
models.User.objects.filter(~Q(username='老王'))
models.User.objects.exclude(username='老王')

F() —- 专门取对象中某列值的操作

F对象允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。
通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交.

1
2
3
4
5
6
7
8
all = BookInfo.objects.filter(auth="小明")
for b in all:
price = b.price
b.price = price + 10
b.save

# 使用F对象来计算
BookInfo.objects.filter(auth="小明").update(price=F("price")+10)

4、判断添加信息是否重复

1
2
3
4
5
6
7
8
ob=User()
ob.username = request.POST.get("username")
ob.nickname = request.POST.get("nickname")
userinfo = User.objects.filter(Q(username=ob.username) | Q(nickname=ob.nickname))
#print(userinfo)
if userinfo.exists():
context = {"info": "账户名称或昵称重复!"}
return render(request, "myadmin/info.html", context)

5、密码加密md5

1
2
3
4
5
6
7
8
import hashlib,random
#获取密码并md5
md5 = hashlib.md5()
n = random.randint(100000, 999999)
s = request.POST['password']+str(n) #从表单中获取密码并添加干扰值
md5.update(s.encode('utf-8')) #将要产生的md5的子串放进去
ob.password_hash = md5.hexdigest() #获取md5值
ob.password_salt = n

5、中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from django.shortcuts import redirect
from django.urls import reverse
import re
class ShopMiddleware:
def __init__(self, get_response):
self.get_response = get_response
print("ShopMiddleware")
# One-time configuration and initialization.

def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.

path=request.path
print("url:",path)

#判断管理后台是否登录
#定义后台允许直接访问的url列表
urllist=['/myadmin/login','/myadmin/dologin','/myadmin/logout','/myadmin/verify']
#判断当前请求url地址是否以/myadmin开头,并且不再urllist中,才做登录pd
if re.match(r'^/myadmin',path) and (path not in urllist):
#判断是否登录(在session中没有adminuser)
if 'adminuser' not in request.session:
#重定向到登录页
return redirect(reverse("myadmin_login"))

response = self.get_response(request)

# Code to be executed for each request/response after
# the view is called.

return response

6、类变量与实例变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A:
aa=10#类变量,所有实例共有的变量

def __init__(self,a,b):
self.a=a
self.b=b
a=A(5,20)
print(a.a)
5
print(A.aa)
10
print(a.aa)
10
B=A(50,20)
B.aa=20
print(B.aa)
20
print(A.aa)
10
print(a.aa)
10
print(B.aa)
20
print(B.a)
50
B.b=100
print(B.b)
100

类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的还是原来类变量的值;
而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象

可以通过点记法给一个实例化的对象赋予任意属性,点记法形式为. = 来为属性赋值,这个值可以是任意的,如python内置的数据类型、其他的对象甚至是一个函数或者是另一个类。

7、原文链接:https://blog.csdn.net/xujin0/article/details/83793808

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
1.filter:

过滤,将满足条件的数据提取出来,返回一个新的QuerySet。

2. exclude:

排除,排除满足条件的数据,返回一个新的QuerySet。

例如,取出book中id大于等于2的图书,并且id不能等于3的图书。示例代码:

books = models.Book.objects.filter(id__gt=1).exclude(id=3)

我们也可以使用Q表达式来实现,

from django.db.models import Q
books = models.Book.objects.filter(id__gt=1).filter(~Q(id=3))

3. annotate:

给QuerySet中的每个对象都添加一个使用查询表达式(聚合函数、F表达式、Q表达式、Func表达式等)的新字段。

例如 给每本图书都添加一个字段叫author_name

from django.db.models import F
books = models.Book.objects.annotate(author_name = F('author__name'))

注意:

Book模型下面最开始是没有author_name这个属性的。只有一个author属性连接的一个外键.

author__name是book下的author属性下的name,即book这个表通过外键访问到author这个表中的name值。

执行完上述代码之后就在book中创建了一个新的属性author_name,但是只在内存中,不会映射到数据库中去。

4.order_by:

指定将查询的结果根据某个字段进行排序。如果要倒叙排序,那么可以在这个字段的前面加一个负号。

示例

1
2
3
4
5
6
7
8
9
10
11
def index2(request):
# 1. 将book中的price属性按照从小到大进行排序
# books = models.Book.objects.order_by('price')
# for book in books:
# print("%s-%s"%(book.name,book.price))

# 2. 将book中的price属性按照从大到小进行排序
books = models.Book.objects.order_by('-price')
for book in books:
print("%s-%s"%(book.name,book.price))
return HttpResponse('success')
修改对应注释代码哪呢个查看到效果。

需求:对价格进行排序,价格一样的就按照页数来进行排序,价格从小到大,页数从大到小。为了方便查看效果,可以先去数据库中修改数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def index2(request):
# 1. 将book中的price属性按照从小到大进行排序
# books = models.Book.objects.order_by('price')
# for book in books:
# print("%s-%s"%(book.name,book.price))

# 2. 将book中的price属性按照从大到小进行排序
# books = models.Book.objects.order_by('-price')
# for book in books:
# print("%s-%s"%(book.name,book.price))

# 3. 对价格进行排序,价格一样的就按照页数来进行排序,价格从小到大,页数从大到小。
books = models.Book.objects.order_by('price','-pages')
for book in books:
print("%s-%s-%s"%(book.name,book.price,book.pages))
return HttpResponse('success')
注意:

books = models.Book.objects.order_by('price','-pages')不等于books = models.Book.objects.order_by('price').order_by('-pages')

如果使用多个order_by,会把前面排序的规则给打乱,只会使用最后面的一个排序方式。

order_by方法并没有改变数据库中的信息位置,只是我们将数据取出来进行了排序。

那么如果我们对数据库中的信息进行了排序,这样我们就不用每次取数据都需要进行一次排序了。应该怎样做呢?

我们只需要在模型中添加点代码就可以了。

例如:我们在Book者恶搞模型中对价格进行排序,价格一样的就按照页数来进行排序,价格从小到大,页数从大到小。

修改Book中的class Meta中的代码:

1
2
3
class Meta:
db_table = 'book_order'
ordering = ['price','-pages']

这样就对数据库中的信息进行了排序,我们在去数据 的时候也不用使用order_by来进行排序了。但是这样需要重新makegrations和migrate一下,这里就不做演示了。

需求:根据每本图书的销量来进行排序

from django.db.models import Q,F,Count

def index2(request):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 将book中的price属性按照从小到大进行排序
# books = models.Book.objects.order_by('price')
# for book in books:
# print("%s-%s"%(book.name,book.price))

# 2. 将book中的price属性按照从大到小进行排序
# books = models.Book.objects.order_by('-price')
# for book in books:
# print("%s-%s"%(book.name,book.price))

# 3. 对价格进行排序,价格一样的就按照页数来进行排序,价格从小到大,页数从大到小。
# books = models.Book.objects.order_by('price','-pages')
# for book in books:
# print("%s-%s-%s"%(book.name,book.price,book.pages))

# 4. 根据每本图书的销量来进行排序
results = models.Book.objects.annotate(sale_num=Count('bookorder__id')).order_by('sale_num')
for result in results:
print("%s-%s"%(result.name,result.sale_num))
return HttpResponse('success')
因为Book这个模型中没有sale_num这个属性,所以我们需要使用annotate这个方法来创建一个sale_num属性,然后使用Count方法进行赋值,然后使用order_by 进行排序。就实现了这个需求。

5. values:

用来指定在提取数据出来,需要提取哪些字段。默认情况下会把表中所有的字段全部都提取出来,可以使用values来进行指定,并且使用了values方法后,提取出的QuerySet中的数据类型不是模型,而是在values方法中指定的字段和值形成的字典。

需求: 只需要提取Book中的id 和 name

示例:

def index3(request):
1
2
3
4
5
# 1. 只需要提取Book中的id 和 name
books = models.Book.objects.values('id','name')
for book in books:
print(book)
return HttpResponse('success')
注意: 返回的是一个字典类型。字典的key就是属性名,value是属性值。

需求:提取Book中的name和author__name,并且字典中的key自己指定,不使用默认的。字典的key分别为bookName和authorNmae

def index3(request):
1
2
3
4
5
6
7
8
9
10
11
# 1. 只需要提取Book中的id 和 name
# books = models.Book.objects.values('id','name')
# for book in books:
# print(book)

# 需求:提取Book中的name和author__name,并且字典中的key自己指定,不使用默认的。
# 字典的key分别为`bookName`和`authorNmae`
books = models.Book.objects.values(bookName=F('name'),authorName=F('author__name'))
for book in books:
print(book)
return HttpResponse('success')
注意:

自己取名字不能取该模型的属性名,否则会报错。

如果在value中不传递任何参数,那么会获取这个模型所有的值。返回的还是一个字典。

6:values_list:

类似于values。只不过返回的QuerySet中,存储的不是字典,而是元组。操作和values是一样的,只是返回类型不一样。

注意: 当我们使用此方法只返回一个值的时候,那么这个元祖中只有一个值,我们可以添加一个参数flat=True,将元祖去掉,从而得到一个字符窜。只有当values_list中只有一个值的时候才能使用这个方法:

示例:

books = models.Book.objects.values_list('name',flat=True)

7. all:

获取这个ORM模型的QuerySet对象。即获取所有的数据。

获取Book中所有数据

Python客栈送红包、纸质书

示例:

books = models.Book.objects.all()

8.select_related:

在提取某个模型的数据的同时,也提前将相关联的数据提取出来。比如提取文章数据,可以使用select_related将author信息提取出来,以后再次使用article.author的时候就不需要再次去访问数据库了。可以减少数据库查询的次数。

1
2
3
4
5
def index4(request):
books = models.Book.objects.select_related('author')
for book in books:
print(book.author.name)
return HttpResponse('succrss')
注意: select_related只能使用在设置了外键的模型中(即只能在一对多模型上,不能多对一,多对多等),比如我们只在Book设置了author外键和publisher外键。那么select_related里面只能传如这两个参数,而不能传入别的参数,如BookOrder,因为我们是在BookOrder中设置的外键连接到Book,并没有在Book中设置外键连接到BookOrder这个模型。

9. prefetch_related:

这个方法和select_related非常的类似,就是在访问多个表中的数据的时候,减少查询的次数。这个方法是为了解决多对一和多对多的关系的查询问题。

需求:从book中通过prefetch_related查询BookOrder中的信息。

示例代码

1
2
3
4
5
6
7
8
9
def index5(request):
books = models.Book.objects.prefetch_related("bookorder_set")
for book in books:
print('*'*30)
print(book.name)
orders = book.bookorder_set.all()
for order in orders:
print(order.id)
return HttpResponse('success')
prefetch_related方法也能办到select_related方法能办到的事情,只是select_related方法效率比prefetch_related方法效率高一点。所以能使用select_related方法的话就是用这个方法。但是这两种方法的执行效率都比传统的方法执行效率高。传统的方法就是先返回book对象,再通过book去查询对应的外键的相关信息。

10. defer:

在一些表中,可能存在很多的字段,但是一些字段的数据量可能是比较庞大的,而此时你又不需要,比如我们在获取文章列表的时候,文章的内容我们是不需要的,因此这时候我们就可以使用defer来过滤掉一些字段。这个字段跟values有点类似,只不过defer返回的不是字典,而是模型。

需求:过滤掉book 的name字段

1
2
3
4
5
6
7
def index6(request):
# 过滤掉book的name字段
books = models.Book.objects.defer('name')
for book in books:
print(book.id)

return HttpResponse('sucdess')
注意: 我们在使用defer过滤掉name字段之后,我们还是可以访问到name属性,是因为当我们访问name属性的时候,Django又去执行了一遍sql语句查询的代码。所以在我们开发的过程中,除非我们确定不会使用到此属性,否则不要去过滤它。

defer虽然能过滤字段,但是有些字段是不能过滤的,比如id,即使你过滤了,也会提取出来。

11. only:

跟defer类似,只不过defer是过滤掉指定的字段,而only是只提取指定的字段。

需求:只提取name属性

1
2
3
4
# 只提取name属性
books = models.Book.objects.only('name')
for book in books:
print(book.id,book.name)
注意: id这个字段我们是不能操作的,像上面一样,我们没有提取id属性,但是还是给我们提取出来了。所以id属性是一定会被提取出来的。

和defer一样,就算我们没有提取某个属性出来,我们还是可以访问到的,只是会重新执行一遍sql代码而已。

12. get:

获取满足条件的数据。这个函数只能返回一条数据,并且如果给的条件有多条数据,那么这个方法会抛出MultipleObjectsReturned错误,如果给的条件没有任何数据,那么就会抛出DoesNotExit错误。所以这个方法在获取数据的只能,只能有且只有一条。

# 获取id为1的数据
book = models.Book.objects.get(id=1)

13. create:

创建一条数据,并且保存到数据库中。这个方法相当于先用指定的模型创建一个对象,然后再调用这个对象的save方法。

publusher = models.Publisher.objects.create(name='知了出版社')

14. get_or_create:


根据某个条件进行查找,如果找到了那么就返回这条数据,如果没有查找到,那么就创建一个。

result = models.Publisher.objects.get_or_create(name='知了出版社')
print(result)

会返回一个元祖

查找的对象以及是否创建了这条数据。False就是没有创建这条数据。

15. bulk_create:

和create方法类似,只是这个方法可以一次性创建多个数据。

publusher = models.Publisher.objects.bulk_create([models.Publisher(name='123出版社'),
models.Publisher(name='abc出版社'),])

16. count:

获取提取的数据的个数。如果想要知道总共有多少条数据,那么建议使用count,而不是使用len(articles)这种。因为count在底层是使用select count(*)来实现的,这种方式比使用len函数更加的高效。

count = models.Book.objects.filter(name='xxx').count()

17. first和last:

返回QuerySet中的第一条和最后一条数据。如果为空则返回none。

18. aggregate:

使用聚合函数。

19. exists:

判断某个条件的数据是否存在。如果要判断某个条件的元素是否存在,那么建议使用exists,这比使用count或者直接判断QuerySet更有效得多。

示例代码如下:

1
2
3
4
5
6
7
8
9
# 最高效的判断值是否存在的方法
if Article.objects.filter(name='三国演义').exists():
print(True)
# 比上面的方法效率低一点
if Article.objects.filter(name='三国演义').count() > 0:
print(True)
# 还要比上面的效率低
if Article.objects.filter(name='三国演义'):
print(True)
20. distinct:

去除掉那些重复的数据。这个方法如果底层数据库用的是MySQL,那么不能传递任何的参数。

需求:提取所有销售的价格超过80元的图书,并且删掉那些重复的,那么可以使用distinct来帮我们实现,示例代码如下:

1
2
3
books = models.Book.objects.filter(bookorder__price__gte=80).distinct()
for book in books:
print(book.name)
并且distinct只会剔除那些完全相同的数据,如果有一个字段不相同,都不会剔除的。

如果在distinct之前使用了order_by,那么因为order_by会提取order_by中指定的字段,因此再使用distinct就会根据多个字段来进行唯一化,所以就不会把那些重复的数据删掉。

示例:

orders = models.BookOrder.objects.order_by("pages").values("book_id").distinct()

21. update:

执行更新操作,在SQL底层走的也是update命令。比如要将所有图书的价格都提高10元。

book = models.Book.objects.update(price=F('price')+5)

22. delete:

删除所有满足条件的数据。删除数据的时候,要注意on_delete指定的处理方式。

例如删除作者id大于等于3的数据

result = models.Author.objects.get(id__gte=4).delete()

删除数据时一定要对你的表了如指掌,因为可能会牵连到很多其他数据。像在这个地方将这个作者删除了之后,那么这个作者对应的图书也将会被删除。

23. 切片操作:

有时候我们查找数据,有可能只需要其中的一部分。那么这时候可以使用切片操作来帮我们完成。QuerySet使用切片操作就跟列表使用切片操作是一样的。

1
2
3
4
# 获取1,2两条数据
books = models.Book.objects.all()[1:3]
for book in books:
print(book)

8、mysql中delete删除主键从删除的最后一个键值开始增加

1
2
3
4
# 解决方法:从删除的第一个键值增加
范式:alter table 表名 AUTO_INCREMENT=N;
delete from studentinfo where stuno =5010;
alter table studentinfo AUTO_INCREMENT=5006;

truncate删除主键从1开始增加

9、django里面DTL使用for循环时,获取当前循环次数使用

10、字典删除

  • Python字典的clear()方法(删除字典内所有元素)
  • Python字典的pop()方法(删除字典给定键 key 所对应的值,返回值为被删除的值)
  • Python字典的popitem()方法(随机返回并删除字典中的一对键和值)
  • del 全局方法(能删单一的元素也能清空字典,清空只需一项操作)

11、在同一个表单中,设置两个传向不同地址的button

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<body>
<form class="form-horizontal" action="" name="useredit" method="post">
<button type="submit" onclick="usersub()" class="btn btn-primary">提交</button> &nbsp;
<button type="submit" onclick="coderes()" class="btn btn-default">重置</button>
</form>
<script>
function usersub(){
document.useredit.action="{% url 'myadmin_user_update' user.id %}";
document.useredit.submit();
}
function coderes() {
document.useredit.action = "{% url 'myadmin_user_resetcode' %}";
document.useredit.submit();
}
</script>
</body>
</html>

12、没有表单时,设置传向两个不同地址的button

1
2
<button type="submit" onclick="window.location='{% url 'web_cart_add' %}'" class="btn btn-warning" style="width:90px;float:right">结 &nbsp; 算</button>&nbsp;&nbsp;
<button type="submit" onclick="window.location='{% url 'web_cart_clear' %}'" class="btn btn-warning" style="width:90px">清 &nbsp; 空</button>
赏

老板大气!!!

微信

扫一扫,分享到微信

微信分享二维码
ML-线性回归
Django常用的web工具
  1. 1. 软件开发过程的划分
  2. 2. 基于Django框架的项目搭建
© 2021 yishishizi
Hexo Theme Yilia by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 友链
  • 关于我

tag:

  • 随笔
  • 主页

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • SMMS图床
  • B站
  • Github
  • leetcode
  • CSDN
  • 软件安装目录
很惭愧<br><br>只做了一点微小的工作<br>谢谢大家