Skip to content

Commit 6157487

Browse files
committed
更新md
更新md
1 parent cf7dbf7 commit 6157487

5 files changed

Lines changed: 265 additions & 0 deletions

File tree

django_note/URL调度器.md

Whitespace-only changes.

django_note/main.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@
33
#### 模型和数据库
44
2. [Django入门-模型](模型.md)
55
3. [Django入门-查询](查询.md)
6+
4. [Django入门-聚合](聚合.md)
7+
#### 处理HTTP请求
8+
5. [Django入门-URL调度器](URL调度器.md)

django_note/查询.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,95 @@ django在调用save()方法时才操作数据库。
110110
>>> Entry.objects.get(pk=1)
111111
<Entry: entry1 headline>
112112
```
113+
114+
#### 限制QuerySet条目数
115+
**不支持负索引**
116+
```python
117+
>>> Blog.objects.all()[:5]
118+
<QuerySet [<Blog: b1>, <Blog: blog2>]>
119+
```
120+
121+
#### 字段查询(where语句)
122+
通过关键字参数的形式(field__lookuptype=value)传递给QuerySet的filter(),get()等方法。比如:
123+
```python
124+
Entry.objects.get(headline__contains='Lennon')
125+
# 等价于 SELECT ... WHERE headline LIKE '%Lennon%';
126+
```
127+
##### 常用的lookuptype:
128+
* exact:完全匹配。
129+
* iexact:不区分大小写的完全匹配。
130+
* contains:等价于like语句。
131+
* in:等价于in语句。
132+
```python
133+
Entry.objects.filter(id__in=[1, 3, 4])
134+
# SELECT ... WHERE id IN (1, 3, 4);
135+
inner_qs = Blog.objects.filter(name__contains='Cheddar')
136+
entries = Entry.objects.filter(blog__in=inner_qs)
137+
# 等价 SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
138+
```
139+
* gt: 大于。
140+
* gte: 大于或等于。
141+
* lt: 小于。
142+
* lte: 小于或等于。
143+
* startswith:同python str.startswith(),区分大小写。
144+
* istartswith: 同python str.startswith(),不区分大小写。
145+
* endswith/iendswith: 原理同上。
146+
* range:
147+
```python
148+
import datetime
149+
start_date = datetime.date(2005, 1, 1)
150+
end_date = datetime.date(2005, 3, 31)
151+
Entry.objects.filter(pub_date__range=(start_date, end_date))
152+
```
153+
* 其他date,year,month,week,day等。
154+
155+
#### 跨关系查询
156+
```python
157+
# 通过blog的条件查询指定的entry
158+
>>> Entry.objects.filter(blog__name='b1')
159+
<QuerySet [<Entry: entry1 headline>]>
160+
# 通过entry的条件反向查找blog
161+
>>> Blog.objects.filter(entry__headline='entry1 headline')
162+
<QuerySet [<Blog: b1>]>
163+
```
164+
165+
#### 同一个模型中不同字段比较(F())
166+
```python
167+
>>> from django.db.models import F
168+
>>> from datetime import timedelta
169+
# 返回所有发布 3 天后被修改的条目
170+
>>> Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
171+
```
172+
173+
#### 通过Q对象完成复杂查询
174+
```python
175+
from django.db.models import Q
176+
Q(question__startswith='Who') | Q(question__startswith='What')
177+
# 等价 WHERE question LIKE 'Who%' OR question LIKE 'What%'
178+
179+
Poll.objects.get(
180+
Q(question__startswith='Who'),
181+
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
182+
)
183+
# 等价 SELECT * from polls WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
184+
```
185+
186+
#### 删除对象
187+
```python
188+
Entry.objects.filter(pub_date__year=2005).delete()
189+
```
190+
#### 更新对象
191+
```python
192+
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')
193+
```
194+
195+
#### 一对多关联查询
196+
```python
197+
# 若模型有个 ForeignKey
198+
>>> e = Entry.objects.get(id=2)
199+
>>> e.blog
200+
201+
# 模型中没有 ForeignKey 反向查找
202+
>>> b = Blog.objects.get(id=1)
203+
>>> b.entry_set.all()
204+
```

django_note/聚合.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
### 模型
2+
```python
3+
from django.db import models
4+
5+
class Author(models.Model):
6+
name = models.CharField(max_length=100)
7+
age = models.IntegerField()
8+
9+
class Publisher(models.Model):
10+
name = models.CharField(max_length=300)
11+
12+
class Book(models.Model):
13+
name = models.CharField(max_length=300)
14+
pages = models.IntegerField()
15+
price = models.DecimalField(max_digits=10, decimal_places=2)
16+
rating = models.FloatField()
17+
authors = models.ManyToManyField(Author)
18+
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
19+
pubdate = models.DateField()
20+
21+
class Store(models.Model):
22+
name = models.CharField(max_length=300)
23+
books = models.ManyToManyField(Book)
24+
```
25+
26+
### 1.常见的聚合查询
27+
```python
28+
# 查看一共有多少本书
29+
>>> Book.objects.count()
30+
2452
31+
32+
# 出版社为BaloneyPress的书一共有多少
33+
>>> Book.objects.filter(publisher__name='BaloneyPress').count()
34+
73
35+
36+
# 所有书的平均价格
37+
>>> from django.db.models import Avg
38+
>>> Book.objects.all().aggregate(Avg('price'))
39+
{'price__avg': 34.35}
40+
41+
# 所有书中价格最高的
42+
>>> from django.db.models import Max
43+
>>> Book.objects.all().aggregate(Max('price'))
44+
{'price__max': Decimal('81.20')}
45+
46+
# 最高价与平均价差多少
47+
>>> from django.db.models import FloatField
48+
>>> Book.objects.aggregate(price_diff=Max('price', output_field=FloatField()) - Avg('price'))
49+
{'price_diff': 46.85}
50+
51+
# 每个出版社出版对应数量的书
52+
>>> from django.db.models import Count
53+
>>> pubs = Publisher.objects.annotate(num_books=Count('book'))
54+
>>> pubs
55+
<QuerySet [<Publisher: BaloneyPress>, <Publisher: SalamiPress>, ...]>
56+
>>> pubs[0].num_books
57+
73
58+
59+
>>> from django.db.models import Q
60+
>>> above_5 = Count('book', filter=Q(book__rating__gt=5))
61+
>>> below_5 = Count('book', filter=Q(book__rating__lte=5))
62+
>>> pubs = Publisher.objects.annotate(below_5=below_5).annotate(above_5=above_5)
63+
>>> pubs[0].above_5
64+
23
65+
>>> pubs[0].below_5
66+
12
67+
68+
# 出版数量最多的前5个出版社
69+
>>> pubs = Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5]
70+
>>> pubs[0].num_books
71+
1323
72+
```
73+
74+
### 2.在QuerySet上聚合
75+
* **通过在 QuerySet 后添加 aggregate() 子句来计算 QuerySet 对象的汇总值。**
76+
* 传递给aggregate()的参数描述了我们要计算的聚合值。
77+
```python
78+
>>> Book.objects.aggregate(average_price=Avg('price'))
79+
{'average_price': 34.35}
80+
```
81+
82+
### 3.为QuerySet上每个条目生成聚合
83+
**使用 annotate() 子句可以生成每一个对象的汇总。当指定 annotate() 子句,QuerySet 中的每一个对象将对指定值进行汇总。**
84+
85+
** aggregate()s是字句,返回的是一个字典;annotate()不是终端子句,它返回的还是一个QuerySet。**
86+
```python
87+
>>> q = Book.objects.annotate(num_authors=Count('authors'))
88+
>>> q[0].num_authors
89+
2
90+
>>> q[1].num_authors
91+
1
92+
```

python_advance/Python中的多进程.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,84 @@ if __name__ == '__main__':
1515
父进程id-14940 子进程id-13808 arg-1
1616
父进程id-14940 子进程id-9976 arg-2
1717
```
18+
19+
## 通过信号量控制进程的退出 kill 15 pid
20+
```python
21+
import multiprocessing
22+
import os
23+
import re
24+
import logging.handlers
25+
import time
26+
import signal
27+
28+
29+
def term(sig_num, addtion):
30+
mylog.info('term current pid is %s, group id is %s' % (os.getpid(), os.getpgrp()))
31+
os.killpg(os.getpgid(os.getpid()), signal.SIGKILL)
32+
33+
34+
def log_record(log_filename):
35+
"""
36+
日志模块配置
37+
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
38+
"""
39+
dir_path = os.path.split(__file__)[0]
40+
logdir = os.path.join(dir_path, 'log')
41+
try:
42+
os.makedirs(logdir, exist_ok=True)
43+
except FileExistsError:
44+
pass
45+
46+
myapp = logging.getLogger(os.path.basename(log_filename))
47+
myapp.setLevel(logging.DEBUG)
48+
# 按照每天一个日志,保留最近14个
49+
filehandler = logging.handlers.TimedRotatingFileHandler(
50+
filename='%s/%s' % (logdir, os.path.basename(log_filename)),
51+
when='midnight', interval=1, backupCount=14)
52+
filehandler.suffix = '%Y%m%d.log'
53+
filehandler.extMatch = re.compile(r'^\d{8}.log$') # 只有填写了此变量才能删除旧日志
54+
filehandler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
55+
myapp.addHandler(filehandler)
56+
# 让日志输出到console
57+
console = logging.StreamHandler()
58+
console.setLevel(logging.INFO)
59+
console.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
60+
myapp.addHandler(console)
61+
return myapp
62+
63+
process_list = []
64+
mylog = log_record('test')
65+
66+
67+
class DataDeal(multiprocessing.Process):
68+
def __init__(self):
69+
multiprocessing.Process.__init__(self)
70+
pass
71+
72+
def run(self):
73+
while True:
74+
mylog.info('ID:{} running....'.format(os.getpid()))
75+
time.sleep(3)
76+
77+
78+
if __name__ == '__main__':
79+
signal.signal(signal.SIGTERM, term)
80+
mylog.info('主进程ID:{}'.format(os.getpid()))
81+
82+
for _ in range(3):
83+
p = DataDeal()
84+
process_list.append(p)
85+
86+
mylog.info(process_list)
87+
for p in process_list:
88+
p.daemon = True
89+
p.start()
90+
91+
for p in process_list:
92+
p.join()
93+
94+
```
95+
1896
## 进程间共享变量
1997
每个进程都有自己的独立内存空间,进程中的变量都是相互独立的。如下所示,修改子进程中变量的值,主进程中变量并不会改变。
2098

0 commit comments

Comments
 (0)