{"pdfData":[[{"bbox":[89,95,175,121],"type":"title","angle":0,"index":0,"text":"# Django","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":0,"id":"2ded7550-fa26-4765-b996-6986df9eb3f2","page_size":[595,841],"block_position":"0-0"},{"bbox":[86,136,505,179],"type":"text","angle":0,"index":1,"text":"本身基于 MVC 模型（架构），即 Model（模型） $^ +$ View（视图） $^ +$ Controller（控制器）设计模式，MVC 模式使后续对程序的修改和扩展简化，并且使程序某一部分的重复利用成为可能。但在 Django 中更常被称为 MTV（Model-Template-View）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"id":"ee1ed222-8a28-4a1c-ba10-95427872efb9","page_size":[595,841],"block_position":"0-1"},{"bbox":[95,183,500,209],"type":"text","angle":0,"index":2,"text":"模型（Model）：负责应用程序的数据和业务逻辑。通过将数据和逻辑从用户界面分离出来，使得模型可以独立于用户界面进行测试和修改。","id":"74806fe8-adb1-497f-a381-deecec73eb27","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-2"},{"bbox":[95,225,503,250],"type":"text","angle":0,"index":3,"text":"视图（View）：负责显示用户界面，但通常没有直接访问应用程序的数据。这使得可以更容易地更改应用程序的外观而不影响数据处理。","id":"001a1ced-69a5-4435-ac54-51f42a41a279","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-3"},{"bbox":[95,266,500,292],"type":"text","angle":0,"index":4,"text":"控制器（Controller）：处理用户输入、更新模型和调整视图。通过将用户输入和应用程序逻辑分离，可以更容易地更改用户界面的交互方式而不影响数据和业务逻辑。","id":"4519ad8f-9be6-4692-a6cc-2e23e2838d15","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-4"},{"bbox":[86,308,485,319],"type":"text","angle":0,"index":6,"text":"Django 提供了全栈开发所需的工具，包括数据库ORM、模板引擎、路由系统、用户认证等，大幅减少重复代码。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"id":"66fdce09-6a3e-475f-92e0-67c619df9a83","page_size":[595,841],"block_position":"0-5"},{"bbox":[87,334,146,345],"type":"title","angle":0,"index":7,"text":"# Django 的哲学:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":0,"id":"29023e24-9dc0-4544-8f08-61ac0cba8a2f","page_size":[595,841],"block_position":"0-6"},{"bbox":[105,360,432,371],"type":"text","angle":0,"index":8,"text":"DRY（Don't Repeat Yourself）: 避免重复代码，提倡复用（如模板继承、模型继承）。","id":"74c573e9-3c48-4827-b427-bd0c415c831b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-7"},{"bbox":[105,386,400,396],"type":"text","angle":0,"index":9,"text":"约定优于配置: 默认提供合理配置（如自动生成Admin 界面），减少决策成本。","id":"994d83f8-c819-4008-abff-978acf1cc314","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-8"},{"bbox":[104,412,500,439],"type":"text","angle":0,"index":10,"text":"快速开发：Django 提供了大量内置功能，如认证、管理后台、表单处理等，让开发者专注于业务逻辑，而非底层实现。","id":"7afecc5a-8310-4c96-a333-662a04f61818","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-9"},{"bbox":[105,454,432,464],"type":"text","angle":0,"index":11,"text":"自动化管理后台：只需简单的模型定义，即可生成强大的后台管理界面，支持增删改查。","id":"04802609-cd28-4cb9-a051-1c95fd7e7f66","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-10"},{"bbox":[104,480,497,506],"type":"text","angle":0,"index":12,"text":"ORM 数据库映射：Django 内置 ORM (Object-Relational Mapping)，可以让开发者使用 Python 类与数据库交互，无需编写 SQL。","id":"7508f4de-2364-4c6e-b255-7ca059079618","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-11"},{"bbox":[105,522,374,532],"type":"text","angle":0,"index":13,"text":"强大的 URL 路由：使用正则表达式灵活定义 URL，轻松实现页面路由。","id":"070cd869-8e0a-41a3-9722-da8bac478df9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-12"},{"bbox":[105,548,419,558],"type":"text","angle":0,"index":14,"text":"模板引擎：内置强大的模板系统，支持逻辑判断、循环处理，方便渲染 HTML 页面。","id":"6583f60b-863e-4825-a128-f1ce09bcadfc","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-13"},{"bbox":[105,574,351,584],"type":"text","angle":0,"index":15,"text":"国际化支持：Django 支持多语言国际化，非常适合全球化应用。","id":"9a56be23-b5e6-4f73-9d9c-3c3f9b8b4c36","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-14"},{"bbox":[105,600,409,610],"type":"text","angle":0,"index":16,"text":"高安全性：内置多种安全保护措施，如防止 SQL 注入、XSS 攻击、CSRF 攻击等。","id":"67262089-d24d-4daf-ab3a-b874cbbf2e43","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-15"},{"bbox":[104,626,506,637],"type":"text","angle":0,"index":17,"text":" 丰富的社区与扩展：大量开源的第三方库，如 Django REST framework、Django CMS 等，快速扩展功能。","id":"fd4015a3-6148-4ed0-a3b5-73bf5874fe14","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":0,"page_size":[595,841],"block_position":"0-16"},{"bbox":[89,649,254,743],"index":19,"angle":0,"type":"image","img_path":"/f4487cc28d0ed6be5aa3b6d12a641d265ce457c6192d9a6a0c73c17c74dfe081.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.2773109243697479,"page_idx":0,"id":"43d4f8f5-ccca-45ac-b43e-099277708f60","page_size":[595,841],"block_position":"0-17"}],[{"bbox":[88,110,163,130],"type":"title","angle":0,"index":0,"text":"# 内置功能","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":1,"id":"7ce99939-2e65-40ef-8738-1482dfbc909a","page_size":[595,841],"block_position":"1-0"},{"bbox":[88,137,594,400],"index":1,"angle":0,"type":"table_body","img_path":"/","id":"001d6598-153c-44ef-91a8-87f52f69cbaf","color":{"line":"rgba(103, 194, 63, 1)","fill":"rgba(103, 194, 63, 1)"},"table_body":"<table><tr><td>功能</td><td>说明</td></tr><tr><td>Admin后台</td><td>自动生成管理界面，无需手动编写CRUD逻辑。</td></tr><tr><td>ORM</td><td>用Python类操作数据库，无需写SQL。</td></tr><tr><td>表单处理</td><td>内置表单验证，防止CSRF攻击。</td></tr><tr><td>用户认证</td><td>提供登录、注册、权限管理（django.contrib.auth）。</td></tr><tr><td>路由系统</td><td>URL映射灵活，支持正则表达式。</td></tr><tr><td>缓存机制</td><td>支持Memcached、Redis等后端。</td></tr></table>","page_idx":1,"page_size":[595,841],"block_position":"1-1"},{"bbox":[88,426,426,597],"index":2,"angle":0,"type":"image","img_path":"/9e8b7b91d694be7a68319af4130f4b3e88f070e1faac0f9b9d52e5a8c0d292a6.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.5680672268907563,"page_idx":1,"id":"9e26c600-a24e-4204-bf72-5822ed99cfdc","page_size":[595,841],"block_position":"1-2"},{"bbox":[88,614,349,635],"type":"title","angle":0,"index":3,"text":"# MVC (Model-View-Controller)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":1,"id":"72a964cc-5808-44a1-9dd0-1ae15d85c05a","page_size":[595,841],"block_position":"1-3"},{"bbox":[104,645,359,655],"type":"text","angle":0,"index":4,"text":"Model (模型)：处理与数据库的交互，定义数据的结构和业务逻辑。","id":"e054d025-15d5-47c3-baab-a1107d1c00fc","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":1,"page_size":[595,841],"block_position":"1-4"},{"bbox":[104,671,332,681],"type":"text","angle":0,"index":5,"text":"View (视图)：负责数据展示，生成用户看到的HTML 页面。","id":"cc70fa2f-6683-4bb5-b289-e4518d2c7b60","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":1,"page_size":[595,841],"block_position":"1-5"},{"bbox":[104,697,453,708],"type":"text","angle":0,"index":6,"text":"Controller (控制器)：接收用户请求，调用Model 处理数据，并将结果传递给View 渲染页面。","id":"44c5ab65-d834-4bf3-ba12-3e8fa609e797","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":1,"page_size":[595,841],"block_position":"1-6"},{"bbox":[88,723,110,733],"type":"title","angle":0,"index":8,"text":"# 流程：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":1,"id":"e145205c-e551-4720-8754-c6775404c2aa","page_size":[595,841],"block_position":"1-7"},{"bbox":[105,749,221,759],"type":"text","angle":0,"index":9,"text":"1. 用户发送请求到 Controller。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":1,"id":"670ba147-8b9b-4d0c-b9ee-68c9c26f3a41","page_size":[595,841],"block_position":"1-8"}],[{"bbox":[105,79,280,90],"type":"text","angle":0,"index":0,"text":"2. Controller 处理逻辑，调用 Model 获取数据。","id":"b1a3104b-9ca2-47aa-8179-534ef4224e85","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-0"},{"bbox":[105,106,233,116],"type":"text","angle":0,"index":1,"text":"3. Controller 将数据传递给 View。","id":"e10ab3c9-3215-4e19-aad8-3c9d7ac84f38","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-1"},{"bbox":[105,132,254,142],"type":"text","angle":0,"index":2,"text":"4. View 渲染并返回 HTML 页面给用户。","id":"0b4147c2-3061-4ad6-b44c-9d0949c91fc9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-2"},{"bbox":[86,161,492,213],"type":"title","angle":0,"index":4,"text":"# MVT (Model-Template-View) —— Django 的实现方式","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":2,"id":"aae16c7a-2d84-4baf-9b9c-be2e0fa4ccfe","page_size":[595,841],"block_position":"2-3"},{"bbox":[86,222,314,234],"type":"text","angle":0,"index":5,"text":"Django 中采用了MVT 设计模式，类似于MVC，但有一些区别：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"id":"98ac2260-e139-4cef-a862-d57fe9b62d51","page_size":[595,841],"block_position":"2-4"},{"bbox":[104,249,367,259],"type":"text","angle":0,"index":6,"text":"Model (模型)：与数据库交互，处理数据的创建、读取、更新、删除。","id":"4ce7bb9f-b70b-47db-8448-01b163e6a624","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-5"},{"bbox":[104,275,333,285],"type":"text","angle":0,"index":7,"text":"Template (模板)：负责页面渲染，生成最终的HTML 内容。","id":"6d499904-3b52-44c1-a79e-1096a447d1cf","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-6"},{"bbox":[104,301,451,312],"type":"text","angle":0,"index":8,"text":"View (视图)：Django 的View 更偏向于控制器的角色，接收请求并决定使用哪个模板和数据。","id":"388bce3d-061a-42dc-80f2-25d70d245806","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-7"},{"bbox":[87,327,110,338],"type":"text","angle":0,"index":10,"text":"流程：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"id":"a5864baa-5dbc-4734-b70f-419a484d391b","page_size":[595,841],"block_position":"2-8"},{"bbox":[86,359,470,375],"type":"title","angle":0,"index":11,"text":"# 用户访问 URL，请求被 Django 的 urls.py 映射到相应的 View。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":2,"id":"ca473403-a4d3-4af1-9e6c-88eb56105f97","page_size":[595,841],"block_position":"2-9"},{"bbox":[123,387,445,528],"index":12,"angle":0,"type":"algorithm","text":"url.py下  \nurlpatterns  $=$  [url(r'^search-form/\\$,search.search_form)，#映射到search.py中search_form视图url(r'^search/\\$,search.search)， #映射到search.py中search视图url(r'^search-post/\\$,search2.search_post),#映射到search2.py中search_post视图]","id":"f240b6c2-9121-40e9-b80d-34a6fb208f4a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-10"},{"bbox":[105,543,384,554],"type":"text","angle":0,"index":13,"text":". 当访问 /search-form/ 时，Django 调用 search.search_form 视图函数","id":"fd60ef80-c3f2-40a1-9256-9872a1968e8e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-11"},{"bbox":[105,569,334,579],"type":"text","angle":0,"index":14,"text":"当提交表单到 /search/ 时，调用 search.search 视图函数","id":"014a62a7-3880-4b71-8f0e-b89e6a7eacec","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-12"},{"bbox":[86,601,351,617],"type":"title","angle":0,"index":16,"text":"# View 处理业务逻辑，调用Model 获取数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":2,"id":"f583b841-6a22-45bc-a13a-3989cfdeaa0e","page_size":[595,841],"block_position":"2-13"},{"bbox":[123,629,280,640],"type":"text","angle":0,"index":17,"text":"(1) 渲染搜索表单（但是这里无Model交互）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"id":"b39db338-f4c2-40f6-8dd6-80c57de11ec8","page_size":[595,841],"block_position":"2-14"},{"bbox":[123,655,343,719],"index":18,"angle":0,"type":"code","text":"```python\n# search.py\ndef search_form(request):\n    return render(request, 'search_form.html')  # 直接渲染模板\n```","id":"56213119-b626-4ab3-b9e6-879f565c48b6","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":2,"page_size":[595,841],"block_position":"2-15"},{"bbox":[105,733,145,743],"type":"text","angle":0,"index":19,"text":"流程：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"id":"fef360bb-aa08-486a-8c68-b0521e8db150","page_size":[595,841],"block_position":"2-16"},{"bbox":[122,749,291,759],"type":"text","angle":0,"index":20,"text":"View 只负责返回模板，未涉及Model 数据操作","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":2,"id":"f78ea737-0ecf-41d1-894a-aa2a11531e32","page_size":[595,841],"block_position":"2-17"}],[{"bbox":[124,105,238,117],"index":0,"angle":0,"type":"code_caption","text":"(2) 处理搜索请求（带参数校验）","id":"cea4de41-b3d4-4283-9e4c-7cf295d6b5b8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-0"},{"bbox":[123,131,352,301],"index":1,"angle":0,"type":"algorithm","text":"def search(request): request_encoding  $=$  'utf-8' if  $\\mathrm{q}^{\\prime}$  in request.GET and request.GET['q']: #业务逻辑判断 message  $=$  '你搜索的内容为:'  $^+$  request.GET['q'] else: message  $=$  '你提交了空表单' return HttpResponse(message)#直接返回响应（未用模板）","id":"cbd96bcd-3df8-4256-a506-dd0cd8a5db73","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-1"},{"bbox":[128,316,227,327],"index":2,"angle":0,"type":"code_caption","text":"（3）# 接收POST请求数据","id":"ad18fca9-2434-4dee-a772-d0146e242f50","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-2"},{"bbox":[123,342,271,459],"index":3,"angle":0,"type":"algorithm","text":"def search_post(request):   \nctx  $= \\{\\}$    \nif request.POST:   \nctx['rlt']  $=$  request.POST['q']   \nreturn render(request, \"post.html\", ctx)","id":"06f9e315-5d1f-4e87-9c22-5063ecffd2e9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-3"},{"bbox":[87,504,280,522],"type":"title","angle":0,"index":4,"text":"# View 将数据传递给 Template。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":3,"id":"a3033513-0547-41ea-8797-2b5b237a65f6","page_size":[595,841],"block_position":"3-4"},{"bbox":[123,558,274,569],"index":5,"angle":0,"type":"code","text":"```lua\nreturn render(request, 'search_form.html')\n```","id":"86090e6b-7996-4a22-a7df-70a5acd8930e","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-5"},{"bbox":[123,584,409,596],"type":"text","angle":0,"index":6,"text":"在这个例子中，search_form 只是用来展示HTML 表单页面，没有动态数据传入。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"id":"5151efd1-9360-4dee-bc1c-e90d840e75d1","page_size":[595,841],"block_position":"3-6"},{"bbox":[123,610,389,621],"type":"text","angle":0,"index":7,"text":"虽然这里没有传递变量，但你可以通过 render 的第三个参数传数据给模板：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"id":"17c0a568-888e-45ff-8289-0c957fbb98bb","page_size":[595,841],"block_position":"3-7"},{"bbox":[123,636,323,647],"index":8,"angle":0,"type":"code","text":"```lua\nreturn render(request, 'search_form.html', {'key': value})\n```","id":"cc78c91a-b7f9-4386-a960-30e088691b95","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-8"},{"bbox":[124,664,279,676],"type":"text","angle":0,"index":9,"text":"第二个没有传输数据因为根本没有template","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"id":"1d7b87bf-d084-4368-9a1d-ee4f6d6dcd67","page_size":[595,841],"block_position":"3-9"},{"bbox":[124,692,166,703],"type":"text","angle":0,"index":10,"text":"第三个例子","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":3,"id":"d4551d87-7fb7-42da-a8ab-9d8bbd27453a","page_size":[595,841],"block_position":"3-10"},{"bbox":[123,719,261,729],"index":11,"angle":0,"type":"code","text":"```lua\nreturn render(request, \"post.html\", ctx)\n```","id":"fc303c14-f952-4577-90b3-d48f58e65fce","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":3,"page_size":[595,841],"block_position":"3-11"}],[{"bbox":[105,80,268,90],"type":"text","angle":0,"index":0,"text":"1. Template 渲染 HTML，最终返回给用户。","id":"e64fb232-d3af-43a6-9c87-2a6018c76409","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-0"},{"bbox":[105,106,229,116],"type":"text","angle":0,"index":1,"text":"模板文件: search_form.html","id":"32c65eb1-8af4-4d92-abe0-3ef0263e3c12","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-1"},{"bbox":[105,211,135,220],"index":3,"angle":0,"type":"code","text":"```txt\n</form>\n```","id":"cc7d4a44-61ff-46de-ac5d-e0739bf41793","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-2"},{"bbox":[87,245,298,262],"type":"title","angle":0,"index":4,"text":"# Tip：HTML <form> action 属性","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":4,"id":"e080b725-45ec-49ce-a9ef-3c0b78e11564","page_size":[595,841],"block_position":"4-3"},{"bbox":[105,296,246,306],"index":5,"angle":0,"type":"code","text":"```twig\n<form action=\"/search/\" method=\"get\">\n```","id":"a252f3fd-63fc-4396-9d89-1c1adfe96c9e","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-4"},{"bbox":[110,323,216,333],"index":6,"angle":0,"type":"code","text":"```twig\n<input type=\"text\" name=\"q\">\n```","id":"776d5076-f932-42c2-b94f-f32c47d128ba","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-5"},{"bbox":[110,349,238,359],"index":7,"angle":0,"type":"code","text":"```txt\n<input type=\"submit\" value=\"搜索\">\n```","id":"4e6d0c5d-f9ab-46f7-aca3-db2a43ba3c1a","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-6"},{"bbox":[105,375,135,384],"index":8,"angle":0,"type":"code","text":"```txt\n</form>\n```","id":"91f561bf-914f-4ae3-9ce4-8938b4ea4f96","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-7"},{"bbox":[105,401,166,412],"type":"text","angle":0,"index":9,"text":"(1) <form> 标签","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"id":"77ec743d-831b-4af9-add4-eab518f752ff","page_size":[595,841],"block_position":"4-8"},{"bbox":[105,428,192,436],"type":"text","angle":0,"index":10,"text":"action=\"/search/\"","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"id":"99817575-89c3-459c-9771-75f81742e616","page_size":[595,841],"block_position":"4-9"},{"bbox":[141,454,254,463],"type":"text","angle":0,"index":11,"text":"o 表单提交的目标URL地址","id":"de27c52e-80bc-44cb-b4d5-97024c3d1063","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-10"},{"bbox":[141,479,443,490],"type":"text","angle":0,"index":12,"text":"o /search/ 表示提交到当前网站的搜索端点（例如 https://example.com/search/）","id":"e62332b4-23ed-4487-906c-8ce5d7cf8ca4","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-11"},{"bbox":[141,505,356,515],"type":"text","angle":0,"index":13,"text":"o 尾部斜杠/ 表示这是一个目录路径（符合RESTful风格）","id":"a2aa92f6-5b90-40ce-ad4b-bf967832c433","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-12"},{"bbox":[105,532,179,541],"type":"text","angle":0,"index":15,"text":". method=\"get\"","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"id":"a51147c1-4808-4ecd-8826-993eb9cc1121","page_size":[595,841],"block_position":"4-13"},{"bbox":[141,558,268,567],"type":"text","angle":0,"index":16,"text":"o 使用 HTTP GET 方法提交数据","id":"00d46a77-7f05-4231-9719-5b9a732ef238","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-14"},{"bbox":[141,583,343,593],"type":"text","angle":0,"index":17,"text":"o 表单数据会附加在URL后（如 /search/?q=关键词）","id":"93e2f73c-ee78-4262-aea5-144c13c600f9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-15"},{"bbox":[141,609,317,619],"type":"text","angle":0,"index":18,"text":"o 适合不修改服务器状态的查询操作（如搜索）","id":"dcccefd2-ce6c-4a07-9074-615ae68bd816","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-16"},{"bbox":[87,635,147,645],"type":"title","angle":0,"index":20,"text":"# 2. 实际工作流程","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":4,"id":"4c03455c-5c7d-435d-a795-f8057f5fed8e","page_size":[595,841],"block_position":"4-17"},{"bbox":[105,662,158,672],"type":"text","angle":0,"index":21,"text":"1. 用户交互","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"id":"023cd146-30c2-45ba-bd2d-2ec5f8652093","page_size":[595,841],"block_position":"4-18"},{"bbox":[141,687,282,698],"type":"text","angle":0,"index":22,"text":"o 在文本框中输入内容（如\"无人机\"）","id":"723176dd-658c-4953-a2bb-5a6c581c1b75","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-19"},{"bbox":[141,714,215,724],"type":"text","angle":0,"index":23,"text":"o 点击\"搜索\"按钮","id":"299655ac-c665-4c07-b30d-da3abfa2329e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"page_size":[595,841],"block_position":"4-20"},{"bbox":[105,740,166,750],"type":"text","angle":0,"index":25,"text":"2. 浏览器行为","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":4,"id":"2a0959c9-4364-4132-adb1-0c3ff80cc01a","page_size":[595,841],"block_position":"4-21"}],[{"bbox":[141,79,289,89],"type":"text","angle":0,"index":0,"text":"o 自动组装 URL：/search/?q=无人机","id":"df10c138-5fdc-43ff-bfe3-fb5f0bb9d97e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"page_size":[595,841],"block_position":"5-0"},{"bbox":[141,105,287,116],"type":"text","angle":0,"index":1,"text":"o 发起GET请求（HTTP头部示例）：","id":"ddae8d8f-22a1-46f2-9978-3cbdc3ed3142","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"page_size":[595,841],"block_position":"5-1"},{"bbox":[87,132,211,142],"type":"text","angle":0,"index":3,"text":"GET /search/?q=无人机 HTTP/1.1","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"4c70a67b-9dbd-45d3-8c1c-2992193f213d","page_size":[595,841],"block_position":"5-2"},{"bbox":[87,158,158,168],"type":"text","angle":0,"index":4,"text":"Host: example.com","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"b16e959f-141e-4b00-b835-d564f05503cf","page_size":[595,841],"block_position":"5-3"},{"bbox":[105,184,166,194],"type":"title","angle":0,"index":5,"text":"# 3. 服务器处理","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":5,"id":"566d543d-64fd-4138-8ab7-d37621e7c16a","page_size":[595,841],"block_position":"5-4"},{"bbox":[141,210,308,220],"type":"text","angle":0,"index":6,"text":"o Django路由将请求交给对应的View处理：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"a67fafef-4b41-4ced-83b5-d530db3c7c67","page_size":[595,841],"block_position":"5-5"},{"bbox":[87,237,121,247],"type":"text","angle":0,"index":7,"text":"# urls.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"2a4dfeb5-8b6e-4726-8851-9c2dd1d4056c","page_size":[595,841],"block_position":"5-6"},{"bbox":[87,262,190,272],"type":"text","angle":0,"index":8,"text":"path('search/', views.search)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"1d07f2b3-41fe-472c-80c7-890faf23e1a1","page_size":[595,841],"block_position":"5-7"},{"bbox":[87,289,128,298],"type":"text","angle":0,"index":9,"text":"# views.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"c373f295-ffde-456f-b2b6-9e7e1525bf56","page_size":[595,841],"block_position":"5-8"},{"bbox":[87,314,161,324],"type":"text","angle":0,"index":10,"text":"def search(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"ba8b9a0f-786d-469c-9ff2-03a34402852e","page_size":[595,841],"block_position":"5-9"},{"bbox":[96,341,269,351],"type":"text","angle":0,"index":11,"text":"query $=$ request.GET.get('q') # 获取参数\"q\"的值","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"f1fad8bd-e2f7-4ee2-b4ac-393b64feafc4","page_size":[595,841],"block_position":"5-10"},{"bbox":[96,367,251,378],"type":"text","angle":0,"index":12,"text":"return HttpResponse(f\"搜索内容：{query}\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"ca3b8b23-a9e9-4f3b-b8ee-0683b3c6e94e","page_size":[595,841],"block_position":"5-11"},{"bbox":[88,450,148,466],"type":"title","angle":0,"index":13,"text":"# 渲染过程:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":5,"id":"d4988fa4-1166-4f8c-b2b4-1cc2fa361a81","page_size":[595,841],"block_position":"5-12"},{"bbox":[141,479,380,489],"type":"text","angle":0,"index":14,"text":"1. search_form 视图调用 render(request, 'search_form.html')","id":"a7d8dffb-0a36-403f-b79f-7c2f29352699","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"page_size":[595,841],"block_position":"5-13"},{"bbox":[141,505,346,515],"type":"text","angle":0,"index":15,"text":"2. Django 模板引擎找到 templates/search_form.html","id":"40a5ee43-e23d-4d84-97ad-39d834a718fe","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"page_size":[595,841],"block_position":"5-14"},{"bbox":[141,530,267,540],"type":"text","angle":0,"index":16,"text":"3. 生成纯静态HTML 返回给用户","id":"467e410b-16b9-40ab-ba78-ee779e28c3b5","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"page_size":[595,841],"block_position":"5-15"},{"bbox":[87,556,287,567],"type":"text","angle":0,"index":18,"text":"第二个方式没有模板渲染，直接返回httpresponse响应。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"e88554cd-8033-4b73-8b5a-9a70da1d9162","page_size":[595,841],"block_position":"5-16"},{"bbox":[123,584,166,595],"type":"text","angle":0,"index":19,"text":"第三个例子","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"69f553c7-5f5f-4920-b09e-929f6a0e5e0b","page_size":[595,841],"block_position":"5-17"},{"bbox":[123,610,286,621],"type":"text","angle":0,"index":20,"text":"<form action=\"/search-post/\" method=\"post\">","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"5c6ab028-f311-4a7a-bc34-72c54a5aa93c","page_size":[595,841],"block_position":"5-18"},{"bbox":[132,636,196,647],"type":"text","angle":0,"index":21,"text":"{% csrf_token %}","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"d1838f38-c525-4f1a-8c06-c79e27c64353","page_size":[595,841],"block_position":"5-19"},{"bbox":[132,663,240,673],"type":"text","angle":0,"index":22,"text":"<input type=\"text\" name=\"q\">","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"a4151b54-8604-464b-a1fd-d2f14b5f2fa9","page_size":[595,841],"block_position":"5-20"},{"bbox":[132,689,260,699],"type":"text","angle":0,"index":23,"text":"<input type $\\mathrel { \\mathop = } \\frac { \\ d } { \\ d t }$ \"submit\" value=\"搜索\">","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"3d4ab327-581f-442e-bfee-c6f2d0350e92","page_size":[595,841],"block_position":"5-21"},{"bbox":[123,715,154,724],"type":"text","angle":0,"index":24,"text":"</form>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":5,"id":"1158cd4b-987b-4c26-ac29-f3097dfe46c7","page_size":[595,841],"block_position":"5-22"}],[{"bbox":[123,80,178,90],"index":0,"angle":0,"type":"code","text":"```txt\n<p>\\{rtt}></p>\n```","id":"7cc26890-3c1a-475a-9bf4-d1322fdf0f95","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":6,"page_size":[595,841],"block_position":"6-0"},{"bbox":[105,106,371,117],"type":"text","angle":0,"index":1,"text":"项目 GET 示例 POST 示例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"1ed5f996-67fe-4aff-ad30-ec2f87113326","page_size":[595,841],"block_position":"6-1"},{"bbox":[105,134,407,146],"type":"text","angle":0,"index":2,"text":"URL 个数 2 个 (/search-form/ 和 /search/) 1 个 (/search-post/)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"ce2c9728-b403-41d7-8b05-78b63fa357a8","page_size":[595,841],"block_position":"6-2"},{"bbox":[105,162,393,173],"type":"text","angle":0,"index":3,"text":"表单方法 method=\"get\" method=\"post\"","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"179c0716-42a2-4177-8567-af124bf22edd","page_size":[595,841],"block_position":"6-3"},{"bbox":[105,190,372,200],"type":"text","angle":0,"index":4,"text":"数据传输方式 通过 URL 参数 (?q=...) 通过请求体","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"00aaad39-a0a6-40a8-94ac-28dd6268c2eb","page_size":[595,841],"block_position":"6-4"},{"bbox":[105,216,420,228],"type":"text","angle":0,"index":5,"text":"安全性 较低，数据暴露在 URL 中 更安全，数据在请求体中","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"c732802d-5d5e-4ec6-b964-28d5407db82f","page_size":[595,841],"block_position":"6-5"},{"bbox":[105,244,357,255],"type":"text","angle":0,"index":6,"text":"CSRF Token 不需要 必须要","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"7f51230d-88f7-4bdf-912b-f829036b7726","page_size":[595,841],"block_position":"6-6"},{"bbox":[105,272,348,282],"type":"text","angle":0,"index":7,"text":"View 函数数量 2 个 1 个","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"89f177a1-8dc1-4ee9-bb77-437ac5946131","page_size":[595,841],"block_position":"6-7"},{"bbox":[105,300,364,311],"type":"text","angle":0,"index":8,"text":"显示与处理 分开处理 合并处理","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"e1fd7c5c-ebce-4b4b-8675-e4d86c5ce092","page_size":[595,841],"block_position":"6-8"},{"bbox":[88,327,166,337],"type":"title","angle":0,"index":9,"text":"# (1) 您的两个视图函数","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":6,"id":"c2799826-2a09-43cb-ba2a-05a9fd1e965c","page_size":[595,841],"block_position":"6-9"},{"bbox":[87,353,205,363],"type":"text","angle":0,"index":10,"text":"# 显示视图 （表面看只负责显示）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"b312b2f0-93f1-4bd2-a7eb-6ee02605b7e9","page_size":[595,841],"block_position":"6-10"},{"bbox":[87,379,182,389],"type":"text","angle":0,"index":11,"text":"def search_form(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"1d5ba38e-89ba-4965-8f3a-9eaa21a4ff80","page_size":[595,841],"block_position":"6-11"},{"bbox":[96,405,335,416],"type":"text","angle":0,"index":12,"text":"return render(request, 'search_form.html') # 但本质上仍是View 层","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"51c4adc0-b90d-4839-89e4-dbffa9f122ad","page_size":[595,841],"block_position":"6-12"},{"bbox":[87,431,205,441],"type":"text","angle":0,"index":13,"text":"# 处理视图 （表面看只负责处理）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"4df38206-14d2-4f99-8be9-7f6667883d12","page_size":[595,841],"block_position":"6-13"},{"bbox":[87,457,161,467],"type":"text","angle":0,"index":14,"text":"def search(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"aa011b3f-898b-4d80-a707-550316c54b3e","page_size":[595,841],"block_position":"6-14"},{"bbox":[96,483,295,493],"type":"text","angle":0,"index":15,"text":"message $=$ process_request(request.GET) # 处理逻辑","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"17b1cc00-7c29-4d58-bb23-d109730c86dc","page_size":[595,841],"block_position":"6-15"},{"bbox":[96,509,255,520],"type":"text","angle":0,"index":16,"text":"return HttpResponse(message) # 响应生成","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"cbd106e8-f2d2-46e8-a82d-d7362ca5221a","page_size":[595,841],"block_position":"6-16"},{"bbox":[88,535,109,544],"type":"title","angle":0,"index":17,"text":"# 本质：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":6,"id":"fa596d2d-a545-45d6-a5fd-4a51e20b5221","page_size":[595,841],"block_position":"6-17"},{"bbox":[86,550,500,561],"type":"text","angle":0,"index":18,"text":"这两个函数都属于View 层，只是内部逻辑侧重不同。Django 的View 是统一的请求处理器，不强制分离显示与处理。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"fc31386a-192b-4644-82e1-1c826fb21a22","page_size":[595,841],"block_position":"6-18"},{"bbox":[88,576,181,587],"type":"title","angle":0,"index":19,"text":"# (2) 为什么不是两个MVT？","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":6,"id":"f05c18e1-b759-4ac3-b368-7fdf31bedcf0","page_size":[595,841],"block_position":"6-19"},{"bbox":[105,602,348,613],"type":"text","angle":0,"index":20,"text":"Model：两个视图可能共享同一个Model（如都查询Article 表）","id":"e0316491-ba79-462d-bea4-ad4088d55068","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"page_size":[595,841],"block_position":"6-20"},{"bbox":[105,629,377,640],"type":"text","angle":0,"index":21,"text":"Template：search_form 使用模板，search 直接返回响应（动态选择）","id":"109f8928-3d23-4e62-bdb6-60a055730892","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"page_size":[595,841],"block_position":"6-21"},{"bbox":[105,655,281,666],"type":"text","angle":0,"index":22,"text":"View：都是接收request 并返回响应的函数","id":"38e32932-99c1-4bab-bcc9-d018b4a6f106","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"page_size":[595,841],"block_position":"6-22"},{"bbox":[88,690,255,715],"type":"title","angle":0,"index":24,"text":"# 创建第一个项目","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":6,"id":"928b9740-51fe-4912-942a-1d07f1ad460c","page_size":[595,841],"block_position":"6-23"},{"bbox":[88,730,246,741],"type":"text","angle":0,"index":25,"text":"使用 django-admin 来创建 HelloWorld 项目：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":6,"id":"1d4360d8-016a-4bc2-84b8-a12fae25666d","page_size":[595,841],"block_position":"6-24"}],[{"bbox":[88,79,254,90],"index":0,"angle":0,"type":"code","text":"```txt\ndjango-admin startproject HelloWorld\n```","id":"9c3149df-b3cf-4487-8719-45b19c0849ba","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-0"},{"bbox":[88,104,149,114],"index":1,"angle":0,"type":"code","text":"```txt\n$ cd HelloWorld/\n```","id":"f77dd8a7-9397-4a07-a8c0-9637f0041fed","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-1"},{"bbox":[88,131,110,140],"index":2,"angle":0,"type":"code","text":"```txt\n$tree\n```","id":"7ff66eef-5383-4d43-84c9-424c80600af1","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-2"},{"bbox":[88,157,218,167],"index":3,"angle":0,"type":"code","text":"```txt\nHelloWorld/ #项目根目录\n```","id":"7186b6bb-ffd4-4103-b419-d38d2eb65a65","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-3"},{"bbox":[89,182,239,193],"index":4,"angle":0,"type":"code","text":"```txt\nmanage.py #项目管理脚本\n```","id":"e860220b-56db-45a3-9810-4a0f73f31e41","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-4"},{"bbox":[89,208,250,219],"index":5,"angle":0,"type":"code","text":"```txt\ndbsqlite3 #SQLite数据库文件\n```","id":"ccaeca70-489a-4f66-a155-e0b5a2e2869d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-5"},{"bbox":[89,234,262,246],"index":6,"angle":0,"type":"code","text":"```txt\n—— Pycache_// #Python字节码缓存\n```","id":"d78f90c6-47e5-44c3-9d5c-7b6b15917d37","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-6"},{"bbox":[89,260,287,271],"index":7,"angle":0,"type":"code","text":"```txt\n—HelloWorld/#项目配置目录（与项目同名）\n```","id":"2c7bd901-b089-4724-95f1-8ab4eccdd197","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-7"},{"bbox":[98,286,226,298],"index":8,"angle":0,"type":"code","text":"```txt\ninit.py #包标识文件\n```","id":"bb449561-2b27-4eb5-9672-292bd8337671","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-8"},{"bbox":[98,312,217,323],"index":9,"angle":0,"type":"code","text":"```txt\n—settings.py #项目设置\n```","id":"e9c430b9-c685-4c41-8dea-8cf9c3aefe12","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-9"},{"bbox":[98,338,217,349],"index":10,"angle":0,"type":"code","text":"```txt\n├—urls.py #主路由配置\n```","id":"c77d0290-30f2-4c22-8010-f6c3a75523d8","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-10"},{"bbox":[98,364,216,376],"index":11,"angle":0,"type":"code","text":"```txt\n— asgi.py #ASGI 配置\n```","id":"377aec11-aa83-4337-b817-de181fbded66","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-11"},{"bbox":[98,391,220,402],"index":12,"angle":0,"type":"code","text":"```txt\n—wsgi.py #WSGI配置\n```","id":"b1b3ea63-2a37-4cb9-ab09-e935c7f4b67c","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-12"},{"bbox":[88,423,151,439],"type":"title","angle":0,"index":13,"text":"# 目录说明：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":7,"id":"51d4670b-8293-4238-b29d-360351f119c3","page_size":[595,841],"block_position":"7-13"},{"bbox":[88,453,186,465],"type":"text","angle":0,"index":14,"text":"项目根目录 (HelloWorld/)：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"id":"3e478d35-5026-479d-adb0-f763b4d9af12","page_size":[595,841],"block_position":"7-14"},{"bbox":[88,469,594,576],"index":15,"angle":0,"type":"table_body","img_path":"/","id":"63cbad01-3d76-45a0-aa4d-debf2f15cf35","color":{"line":"rgba(103, 194, 63, 1)","fill":"rgba(103, 194, 63, 1)"},"table_body":"<table><tr><td>文件/目录</td><td>作用</td></tr><tr><td>manage.py</td><td>Django命令行工具入口，可让你以各种方式与该Django项目进行交互。用于运行开发服务器、数据库迁移等操作。</td></tr><tr><td>db.sql3</td><td>SQLite 数据库文件（默认数据库，开发环境使用）。</td></tr><tr><td>__pycache__I</td><td>Python字节码缓存目录（自动生成，无需手动修改）。</td></tr></table>","page_idx":7,"page_size":[595,841],"block_position":"7-15"},{"bbox":[79,597,190,607],"type":"text","angle":0,"index":16,"text":"HelloWorld: 项目的容器。","id":"43f76d78-3b54-4f04-8a6c-39d436dc4469","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-16"},{"bbox":[79,622,371,634],"type":"text","angle":0,"index":17,"text":"HelloWorld/__init__.py: 一个空文件，告诉 Python 该目录是一个 Python 包。","id":"d1f8956e-4fc3-433e-bab7-4db2e059e2da","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-17"},{"bbox":[79,649,383,660],"type":"text","angle":0,"index":18,"text":"HelloWorld/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口，以便运行你的项目。","id":"15d7a0ee-87d6-4d3f-b7dd-90d60f71d7c6","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-18"},{"bbox":[79,675,290,686],"type":"text","angle":0,"index":19,"text":"HelloWorld/settings.py: 该 Django 项目的设置/配置。","id":"8857dd8c-0bd0-4710-9e56-ffa306fc89fb","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"page_size":[595,841],"block_position":"7-19"},{"bbox":[127,722,205,733],"type":"text","angle":0,"index":22,"text":"核心配置文件，包含：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"id":"c7d8ef9f-9ee2-4cd1-9227-cb950cb3af62","page_size":[595,841],"block_position":"7-20"},{"bbox":[127,738,228,749],"type":"text","angle":0,"index":23,"text":"- 数据库设置 (DATABASES)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":7,"id":"74a2bcb3-435c-4104-a9a4-4c192a4e23cf","page_size":[595,841],"block_position":"7-21"}],[{"bbox":[127,85,238,98],"type":"text","angle":0,"index":0,"text":"- 静态文件路径 (STATIC_URL)","id":"1991625d-0e24-4e98-b6d9-b1327a26f29d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"page_size":[595,841],"block_position":"8-0"},{"bbox":[127,100,242,112],"type":"text","angle":0,"index":1,"text":"- 应用注册 (INSTALLED_APPS)","id":"ca7446fd-7a86-4c9c-a6c4-16eaf211d352","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"page_size":[595,841],"block_position":"8-1"},{"bbox":[127,117,245,128],"type":"text","angle":0,"index":2,"text":"- 调试模式 (DEBUG=True/False)","id":"45e5719e-0fb0-4446-aca9-4ddfd9cdc99c","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"page_size":[595,841],"block_position":"8-2"},{"bbox":[80,174,396,186],"type":"text","angle":0,"index":4,"text":"HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站\"目录\"。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"b4736464-8671-4b9e-84ea-b2bb70bb88f3","page_size":[595,841],"block_position":"8-3"},{"bbox":[101,222,287,233],"type":"text","angle":0,"index":5,"text":"主路由配置文件，定义URL 路径与视图的映射关系。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"92385e16-151d-4dd5-9e98-e75945ce63f7","page_size":[595,841],"block_position":"8-4"},{"bbox":[99,280,459,384],"index":6,"angle":0,"type":"image","img_path":"/a823f7d1709065a5407af080d7f7f97b7690b14cc995738e94875496ffb4c9e6.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.6050420168067226,"page_idx":8,"id":"1ee4accd-7741-4d51-adfb-ead60a3eb212","page_size":[595,841],"block_position":"8-5"},{"bbox":[80,400,388,412],"type":"text","angle":0,"index":7,"text":"HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口，以便运行你的项目。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"55b1ca33-035b-4362-82ae-a1de8abce06c","page_size":[595,841],"block_position":"8-6"},{"bbox":[88,435,174,451],"type":"title","angle":0,"index":8,"text":"# 关键文件详解","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":8,"id":"8aceb6d3-da86-4811-bca6-97ed86e09e3e","page_size":[595,841],"block_position":"8-7"},{"bbox":[80,487,170,498],"type":"text","angle":0,"index":9,"text":"1. settings.py（核心配置）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"a67a1986-1b6a-4c86-946f-e232011d82ed","page_size":[595,841],"block_position":"8-8"},{"bbox":[80,513,99,523],"type":"text","angle":0,"index":10,"text":"实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"ab918cfd-f6a7-4969-9ec6-33453631c17e","page_size":[595,841],"block_position":"8-9"},{"bbox":[80,539,196,550],"type":"text","angle":0,"index":11,"text":"# HelloWorld/settings.py 示例片段","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"6e48131f-898d-4ff9-804e-7b4e06f33011","page_size":[595,841],"block_position":"8-10"},{"bbox":[80,571,220,581],"type":"text","angle":0,"index":12,"text":"# 安全警告：生产环境必须关闭DEBUG！","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"016349a1-0dc5-4297-b55d-917c614aee3c","page_size":[595,841],"block_position":"8-11"},{"bbox":[80,587,128,595],"type":"text","angle":0,"index":13,"text":"DEBUG $=$ True","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"a9a672e5-a5cd-4d4b-bad8-1fb3232833c9","page_size":[595,841],"block_position":"8-12"},{"bbox":[80,618,232,628],"type":"text","angle":0,"index":14,"text":"# 允许访问的域名（DEBUG=False 时需配置）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"6e63977b-55cf-40fb-8d75-9e4d6aa37ef2","page_size":[595,841],"block_position":"8-13"},{"bbox":[80,633,152,643],"type":"text","angle":0,"index":15,"text":"ALLOWED_HOSTS = []","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"de3f6e19-39d5-4ba5-982a-63d2b53ad481","page_size":[595,841],"block_position":"8-14"},{"bbox":[80,664,155,675],"type":"text","angle":0,"index":16,"text":"# 注册的 Django 应用","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"999ce528-388a-4841-8fce-c818898b15c0","page_size":[595,841],"block_position":"8-15"},{"bbox":[80,679,148,690],"type":"text","angle":0,"index":17,"text":"INSTALLED_APPS = [","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"52f1148d-e620-4f73-906c-94ff8fa4c30f","page_size":[595,841],"block_position":"8-16"},{"bbox":[88,695,214,705],"type":"text","angle":0,"index":18,"text":"'django.contrib.admin', # 管理员后台","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"7ad75703-55e1-49b1-936e-97294b7eb996","page_size":[595,841],"block_position":"8-17"},{"bbox":[88,711,203,721],"type":"text","angle":0,"index":19,"text":"'django.contrib.auth', # 认证系统","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"db530ee3-b83a-4ad8-85ac-ce3139ce6a97","page_size":[595,841],"block_position":"8-18"},{"bbox":[88,726,187,736],"type":"text","angle":0,"index":20,"text":"'django.contrib.contenttypes',","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"7146d50b-8bff-463b-9d7e-c6cd937faf5a","page_size":[595,841],"block_position":"8-19"},{"bbox":[88,742,171,751],"type":"text","angle":0,"index":21,"text":"'django.contrib.sessions',","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":8,"id":"26613371-65aa-45d6-bb99-4c1cd1c82567","page_size":[595,841],"block_position":"8-20"}],[{"bbox":[77,79,268,295],"index":0,"angle":0,"type":"code","text":"```python\n'django.contrib.messages',  \n'django.contrib(staticfiles', #静态文件处理  \n]  \n#数据库配置（默认SQLite）  \nDATABASES = {  \n    'default': {  \n        'ENGINE': 'django.db.backendssqlite3',  \n        'NAME': BASE_DIR / 'db.sqlite3', #数据库文件路径}  \n}  \n#静态文件URL（CSS/JS/图片）  \nSTATIC_URL = 'static/'\n```","id":"306adf92-2848-4283-a4b1-1456590d755e","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":9,"page_size":[595,841],"block_position":"9-0"},{"bbox":[80,308,157,319],"type":"title","angle":0,"index":1,"text":"# 2. urls.py（路由配置）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":9,"id":"afc7d678-8e7e-4a90-a801-fee7742f0338","page_size":[595,841],"block_position":"9-1"},{"bbox":[80,334,100,345],"type":"title","angle":0,"index":2,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":9,"id":"d497a980-4ae1-4cf8-8f68-2aa86d09a754","page_size":[595,841],"block_position":"9-2"},{"bbox":[80,360,170,371],"type":"text","angle":0,"index":3,"text":"# HelloWorld/urls.py 示例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"d182a2ec-ac8b-4a56-beed-f2038efd0453","page_size":[595,841],"block_position":"9-3"},{"bbox":[80,392,195,402],"type":"text","angle":0,"index":4,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"c5d64d33-5345-4a6b-8572-0a7927b56bd4","page_size":[595,841],"block_position":"9-4"},{"bbox":[80,407,179,417],"type":"text","angle":0,"index":5,"text":"from django.urls import path","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"625134c7-e246-4630-bf57-e69f91c48b4d","page_size":[595,841],"block_position":"9-5"},{"bbox":[80,439,248,512],"index":6,"angle":0,"type":"algorithm","text":"urlpatterns  $= [$  path('admin／',admin.site.urls)，#后台管理路由 #可在此添加自定义路由，如： #path('blog／',include('blog URLs'))   \n]","id":"c167325f-d8c0-4cac-9de6-fc25f4b1469e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"page_size":[595,841],"block_position":"9-6"},{"bbox":[80,527,187,538],"type":"title","angle":0,"index":7,"text":"# 3. manage.py（项目管理脚本）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":9,"id":"1336f065-1d60-4a01-971c-bc8c939bd442","page_size":[595,841],"block_position":"9-7"},{"bbox":[80,553,100,563],"type":"title","angle":0,"index":8,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":9,"id":"258932b0-39a3-4587-a016-b5fc25250378","page_size":[595,841],"block_position":"9-8"},{"bbox":[80,579,156,589],"type":"text","angle":0,"index":9,"text":"#!/usr/bin/env python","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"7c70a7e2-3369-4a2a-aedb-8f913b656cf0","page_size":[595,841],"block_position":"9-9"},{"bbox":[80,595,115,604],"type":"text","angle":0,"index":10,"text":"import os","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"473b5c67-d36b-4b7f-b974-2683ee411d93","page_size":[595,841],"block_position":"9-10"},{"bbox":[80,610,117,620],"type":"text","angle":0,"index":11,"text":"import sys","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"de456106-45e7-4e32-9eb9-3464bab0f949","page_size":[595,841],"block_position":"9-11"},{"bbox":[80,641,340,700],"index":12,"angle":0,"type":"code","text":"```python\nif __name__ == \"_main_:  \nos.environ.setdefault(\"DJANGO.SettingsMODULE\", \"HelloWorld.Settings\")  \nfrom django.core.management import execute_from_command_line  \nexecute_from_command_line(sys.argv)\n```","id":"e640a0c1-7d43-468c-961c-2083ac3729ce","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":9,"page_size":[595,841],"block_position":"9-12"},{"bbox":[88,719,158,735],"type":"title","angle":0,"index":13,"text":"# 启动服务器","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":9,"id":"e6a891d8-cc46-4472-9323-1be2946aed26","page_size":[595,841],"block_position":"9-13"},{"bbox":[79,748,295,759],"type":"text","angle":0,"index":14,"text":"接下来我们进入 HelloWorld 目录输入以下命令，启动服务器：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":9,"id":"a45ea6e5-d520-429a-b472-4da62cc7eaf1","page_size":[595,841],"block_position":"9-14"}],[{"bbox":[80,80,224,90],"type":"header","angle":0,"index":-99999,"text":"python3 manage.py runserver 0.0.0.0:8000","color":{"line":"rgba(164, 164, 164, 1)","fill":"rgba(164, 164, 164, 1)"},"page_idx":10,"is_discarded":true,"id":"8442bbcd-1ff2-46fd-9021-836f0cd8e396","page_size":[595,841],"block_position":"10-0"},{"bbox":[79,106,418,117],"type":"text","angle":0,"index":1,"text":"0.0.0.0 让其它电脑可连接到开发服务器，8000 为端口号。如果不说明，那么端口号默认为 $8 0 0 0 _ { \\circ }$","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"33db2443-ce50-4007-b821-d3d4d753b497","page_size":[595,841],"block_position":"10-1"},{"bbox":[79,132,381,143],"type":"text","angle":0,"index":2,"text":"在浏览器输入你服务器的 ip（这里我们输入本机 IP 地址： 127.0.0.1:8000） 及端口号。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"b08ae3b2-6ff6-4ec9-ab35-53f2e1a15995","page_size":[595,841],"block_position":"10-2"},{"bbox":[88,163,273,181],"type":"title","angle":0,"index":3,"text":"# 常用 django-admin 命令详解","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":10,"id":"c8a1def7-c786-45fa-b1d1-8fd64953ac21","page_size":[595,841],"block_position":"10-3"},{"bbox":[86,191,403,203],"type":"text","angle":0,"index":4,"text":"django-admin 是 Django 框架提供的一个命令行工具，它是管理 Django 项目的核心工具。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"dfbe9fc5-1a80-4a55-b9c5-e7a339440c98","page_size":[595,841],"block_position":"10-4"},{"bbox":[86,210,431,221],"type":"text","angle":0,"index":5,"text":"无论是创建新项目、运行开发服务器，还是执行数据库迁移，django-admin 都是不可或缺的工具。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"56f1b086-4aef-4b21-8cee-738924de1bec","page_size":[595,841],"block_position":"10-5"},{"bbox":[87,227,267,239],"type":"text","angle":0,"index":6,"text":"要查看 django-admin 提供的所有命令，可以运行：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"09b3b482-77fa-4ba3-aa20-cb306b4c6637","page_size":[595,841],"block_position":"10-6"},{"bbox":[87,246,157,257],"type":"text","angle":0,"index":7,"text":"django-admin help","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"9e30ca76-3956-436f-b90a-7698457987bc","page_size":[595,841],"block_position":"10-7"},{"bbox":[88,299,175,316],"type":"title","angle":0,"index":8,"text":"# 1. 创建新项目","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":10,"id":"9c0ecd7d-65e7-4215-8825-c21ca84d76cb","page_size":[595,841],"block_position":"10-8"},{"bbox":[80,351,202,361],"type":"text","angle":0,"index":9,"text":"django-admin startproject 项目名称","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"16c82325-a9a9-4c1d-bfdb-46ac868c712f","page_size":[595,841],"block_position":"10-9"},{"bbox":[79,376,345,387],"type":"text","angle":0,"index":10,"text":"这个命令会在当前目录下创建一个新的 Django 项目，包含基本的项目结构：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"68096d4f-d325-422c-8eca-c4b3c14172c7","page_size":[595,841],"block_position":"10-10"},{"bbox":[105,403,219,413],"type":"text","angle":0,"index":11,"text":"manage.py：项目管理脚本","id":"e317713b-2204-4eb2-8add-576cea140ff7","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-11"},{"bbox":[105,428,210,439],"type":"text","angle":0,"index":12,"text":"项目名称/：项目主目录","id":"e0003320-c087-40c4-bfb9-9fa0abf78848","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-12"},{"bbox":[141,454,199,465],"type":"text","angle":0,"index":14,"text":"o __init__.py","id":"f9098fdc-a9b6-403d-a500-b060cf6e3363","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-13"},{"bbox":[141,481,253,491],"type":"text","angle":0,"index":15,"text":"o settings.py：项目设置文件","id":"03e7eb35-51e7-4138-a103-092960b2deac","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-14"},{"bbox":[141,507,239,517],"type":"text","angle":0,"index":16,"text":"o urls.py：URL 路由配置","id":"bd3b5f7a-0800-46bf-a979-026c877438c3","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-15"},{"bbox":[141,533,246,543],"type":"text","angle":0,"index":17,"text":"o wsgi.py：WSGI 应用入口","id":"434ecfa1-6b0c-4c59-bce1-c9f1e4384c99","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-16"},{"bbox":[87,568,176,584],"type":"title","angle":0,"index":19,"text":"# 2. 创建新应用","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":10,"id":"511478e9-b337-4d07-a80e-586064b00866","page_size":[595,841],"block_position":"10-17"},{"bbox":[80,619,315,630],"type":"text","angle":0,"index":20,"text":"虽然通常使用 manage.py 来创建应用，但也可以通过 django-admin：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"bcdf8118-5ae3-464d-b42b-d4f2ce997fd1","page_size":[595,841],"block_position":"10-18"},{"bbox":[80,646,190,656],"type":"text","angle":0,"index":21,"text":"django-admin startapp 应用名称","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"8b1944db-ecdb-46c0-87f5-a3a8ebe0a93f","page_size":[595,841],"block_position":"10-19"},{"bbox":[80,672,217,682],"type":"text","angle":0,"index":22,"text":"这会创建一个新的 Django 应用，包含：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"id":"0e740f3f-4c91-4305-9166-3b9e1e508815","page_size":[595,841],"block_position":"10-20"},{"bbox":[105,698,243,708],"type":"text","angle":0,"index":23,"text":"migrations/：数据库迁移文件目录","id":"f4653801-9a1d-4a82-b79e-a3dfbb50c809","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-21"},{"bbox":[105,724,163,735],"type":"text","angle":0,"index":24,"text":"__init__.py","id":"bccdcaa3-4410-4c0e-8e27-4bdd0789f6e0","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-22"},{"bbox":[105,751,212,761],"type":"text","angle":0,"index":25,"text":"admin.py：管理后台配置","id":"a52509af-7376-4c62-8506-789aa2d014a9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":10,"page_size":[595,841],"block_position":"10-23"}],[{"bbox":[105,80,191,89],"type":"text","angle":0,"index":0,"text":"apps.py：应用配置","id":"566184bd-4d17-4280-9542-5868b6d3f1ae","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"page_size":[595,841],"block_position":"11-0"},{"bbox":[105,106,214,116],"type":"text","angle":0,"index":1,"text":"models.py：数据模型定义","id":"9a1414db-a52f-4dcd-b71b-4536f6801a49","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"page_size":[595,841],"block_position":"11-1"},{"bbox":[105,132,190,142],"type":"text","angle":0,"index":2,"text":"tests.py：测试代码","id":"d5947f3b-09df-41d6-abe9-efc033f4c132","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"page_size":[595,841],"block_position":"11-2"},{"bbox":[105,158,193,168],"type":"text","angle":0,"index":3,"text":"views.py：视图函数","id":"70d18691-fc63-42ff-9a22-abf720a71d6c","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"page_size":[595,841],"block_position":"11-3"},{"bbox":[105,185,142,193],"type":"text","angle":0,"index":5,"text":"models.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"057e1070-3c67-4510-af52-0550623885e2","page_size":[595,841],"block_position":"11-4"},{"bbox":[105,211,223,220],"type":"text","angle":0,"index":6,"text":"定义数据模型，与数据库表对应：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"f07137a0-c1a4-413d-a5a9-71df3c09ca61","page_size":[595,841],"block_position":"11-5"},{"bbox":[106,237,124,246],"type":"title","angle":0,"index":7,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":11,"id":"1b55d50f-266d-4dd8-b58c-e92b51e780a8","page_size":[595,841],"block_position":"11-6"},{"bbox":[105,263,208,272],"type":"text","angle":0,"index":8,"text":"from django.db import models","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"8157463d-57b3-4e01-92bf-3267a27a7e2b","page_size":[595,841],"block_position":"11-7"},{"bbox":[105,294,320,350],"index":9,"angle":0,"type":"algorithm","text":"class Product/models.Model): name  $=$  models.CharField(max_length  $\\coloneqq$  100) price  $=$  modelsDecimalField(maxDigits  $\\coloneqq$  10,decimal_places  $\\coloneqq$  2) description  $=$  models.TextField()","id":"61113625-0569-4dcc-8687-40ef9f0325f7","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"page_size":[595,841],"block_position":"11-8"},{"bbox":[113,371,171,381],"type":"text","angle":0,"index":10,"text":"def __str__(self):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"0913c864-f398-4d28-be6b-3c9b5638d3cf","page_size":[595,841],"block_position":"11-9"},{"bbox":[120,388,176,396],"type":"text","angle":0,"index":11,"text":"return self.name","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"ee7dd484-e32d-4e33-8318-e8851c8408ba","page_size":[595,841],"block_position":"11-10"},{"bbox":[105,414,137,423],"type":"text","angle":0,"index":12,"text":"views.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"9c5b36c0-9dc5-4866-8e91-f36eb7dd5406","page_size":[595,841],"block_position":"11-11"},{"bbox":[105,439,199,449],"type":"text","angle":0,"index":13,"text":"处理业务逻辑，返回响应：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"70d826fd-e43e-485b-9d97-ff4abda8bb11","page_size":[595,841],"block_position":"11-12"},{"bbox":[106,465,124,475],"type":"title","angle":0,"index":14,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":11,"id":"38dacf1f-f9fe-41bf-b500-c808908b469b","page_size":[595,841],"block_position":"11-13"},{"bbox":[105,491,228,501],"type":"text","angle":0,"index":15,"text":"from django.shortcuts import render","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"f367f845-d559-4518-9b2d-f7cbe82942ea","page_size":[595,841],"block_position":"11-14"},{"bbox":[105,507,204,516],"type":"text","angle":0,"index":16,"text":"from .models import Product","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"a8d48fdd-72ad-4b89-8844-aa2ea135e7e2","page_size":[595,841],"block_position":"11-15"},{"bbox":[105,539,351,579],"index":17,"angle":0,"type":"code","text":"```python\ndef product_list(request):\n    products = Product.objects.all()\n    return render(request, 'myapp/product_list.html', {'products': products})\n```","id":"ca123033-1a89-4add-bb99-761857faf49a","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":11,"page_size":[595,841],"block_position":"11-16"},{"bbox":[105,596,139,605],"type":"text","angle":0,"index":18,"text":"admin.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"bcd43a29-d316-4d30-9530-d3a1f0bb0147","page_size":[595,841],"block_position":"11-17"},{"bbox":[105,622,185,632],"type":"text","angle":0,"index":19,"text":"配置 Django 管理后台：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"7de113b1-b19f-47a3-901b-090f2a6c5400","page_size":[595,841],"block_position":"11-18"},{"bbox":[106,648,124,657],"type":"title","angle":0,"index":20,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":11,"id":"8774e8f2-9e87-42e2-827c-21f45057e5e5","page_size":[595,841],"block_position":"11-19"},{"bbox":[105,673,220,683],"type":"text","angle":0,"index":21,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"a21db6db-a569-435c-a2ba-a7e860c3c8f5","page_size":[595,841],"block_position":"11-20"},{"bbox":[105,690,204,698],"type":"text","angle":0,"index":22,"text":"from .models import Product","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"588eda63-bcf9-4c1d-93bf-dbb779bcf50f","page_size":[595,841],"block_position":"11-21"},{"bbox":[106,720,192,729],"type":"text","angle":0,"index":23,"text":"@admin.register(Product)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":11,"id":"59505b3e-089c-4e08-ba8e-cb06756aef89","page_size":[595,841],"block_position":"11-22"}],[{"bbox":[105,80,244,90],"type":"header","angle":0,"index":-99999,"text":"class ProductAdmin(admin.ModelAdmin):","color":{"line":"rgba(164, 164, 164, 1)","fill":"rgba(164, 164, 164, 1)"},"page_idx":12,"is_discarded":true,"id":"11e33513-2f35-494a-9802-0e71d1dc916d","page_size":[595,841],"block_position":"12-0"},{"bbox":[113,95,209,105],"type":"header","angle":0,"index":-99998,"text":"list_display $=$ ('name', 'price')","color":{"line":"rgba(164, 164, 164, 1)","fill":"rgba(164, 164, 164, 1)"},"page_idx":12,"is_discarded":true,"id":"3cff5a33-398d-4f53-9ad9-106639e4ebf4","page_size":[595,841],"block_position":"12-1"},{"bbox":[87,157,190,173],"type":"title","angle":0,"index":2,"text":"# 3. 检查项目配置","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":12,"id":"4529e285-94b7-49ea-b584-39ae8a0812af","page_size":[595,841],"block_position":"12-2"},{"bbox":[80,208,149,218],"type":"text","angle":0,"index":3,"text":"django-admin check","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"00aa4aa0-4f93-45d9-9cdd-0b3afe70470c","page_size":[595,841],"block_position":"12-3"},{"bbox":[79,234,280,245],"type":"text","angle":0,"index":4,"text":"这个命令会检查你的 Django 项目是否有配置错误，包括：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"cb7ed042-8bdd-4c0b-aed7-79aaf440d9b3","page_size":[595,841],"block_position":"12-4"},{"bbox":[105,260,190,270],"type":"text","angle":0,"index":5,"text":". 模型定义是否正确","id":"c679448a-3faf-4622-9b59-ce069da32888","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"page_size":[595,841],"block_position":"12-5"},{"bbox":[105,287,189,296],"type":"text","angle":0,"index":6,"text":"URL 配置是否有效","id":"96e8eddc-5ed9-46db-b537-496edfa1bdf7","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"page_size":[595,841],"block_position":"12-6"},{"bbox":[105,312,190,322],"type":"text","angle":0,"index":7,"text":"模板设置是否正确","id":"72a087cc-dc54-4419-851a-04e39adadde2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"page_size":[595,841],"block_position":"12-7"},{"bbox":[105,338,182,349],"type":"text","angle":0,"index":8,"text":"静态文件配置等","id":"23a06409-8cb0-48db-a2e7-2413523f2926","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"page_size":[595,841],"block_position":"12-8"},{"bbox":[87,374,176,390],"type":"title","angle":0,"index":10,"text":"# 4. 数据库迁移","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":12,"id":"c1c145ef-9697-413e-8932-ff9dbe819e32","page_size":[595,841],"block_position":"12-9"},{"bbox":[80,425,238,435],"type":"text","angle":0,"index":11,"text":"Django 使用迁移系统来管理数据库模式变更：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"24b37fd8-9f9d-44da-879d-d080bbf37690","page_size":[595,841],"block_position":"12-10"},{"bbox":[80,452,239,461],"type":"text","angle":0,"index":12,"text":"django-admin makemigrations # 创建迁移文件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"5acd7c4e-d48f-4440-ad17-4eb044145f77","page_size":[595,841],"block_position":"12-11"},{"bbox":[80,478,239,487],"type":"text","angle":0,"index":13,"text":"django-admin migrate # 应用迁移到数据库","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"ebdf9ff7-7421-43ad-9ab3-3336319402ae","page_size":[595,841],"block_position":"12-12"},{"bbox":[87,512,189,528],"type":"title","angle":0,"index":14,"text":"# 5. 创建超级用户","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":12,"id":"f89abcb6-aa0e-451f-a115-6888daeffea7","page_size":[595,841],"block_position":"12-13"},{"bbox":[80,565,182,573],"type":"text","angle":0,"index":15,"text":"django-admin createsuperuser","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"fcca50e8-c083-4e8f-8128-a799c28d401f","page_size":[595,841],"block_position":"12-14"},{"bbox":[79,590,312,601],"type":"text","angle":0,"index":16,"text":"这个命令会引导你创建一个可以访问 Django 管理后台的超级用户。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"8003fdff-569d-48ae-8318-be61f988646e","page_size":[595,841],"block_position":"12-15"},{"bbox":[87,625,200,641],"type":"title","angle":0,"index":17,"text":"# 6.启动开发服务器","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":12,"id":"2752ff14-caee-4863-a259-3bbacc13c6eb","page_size":[595,841],"block_position":"12-16"},{"bbox":[80,677,163,687],"type":"text","angle":0,"index":18,"text":"django-admin runserver","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"6cfb529f-815d-411b-b203-8d432803b9b3","page_size":[595,841],"block_position":"12-17"},{"bbox":[80,703,117,713],"type":"text","angle":0,"index":19,"text":"基本语法:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"819890dc-5896-483e-b8da-0e995bbac8a6","page_size":[595,841],"block_position":"12-18"},{"bbox":[80,729,207,740],"type":"text","angle":0,"index":20,"text":"python manage.py runserver [IP:端口]","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":12,"id":"165f8ea3-d9cd-433d-add2-5df18e330603","page_size":[595,841],"block_position":"12-19"}],[{"bbox":[87,85,284,101],"type":"title","angle":0,"index":0,"text":"# 扩展目录（非自动生成，但常用）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":13,"id":"74ae4594-af9a-42b4-9211-76d33ba5ade3","page_size":[595,841],"block_position":"13-0"},{"bbox":[80,114,123,122],"type":"text","angle":0,"index":1,"text":"HelloWorld/","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"id":"592c2698-958d-4548-a6cb-5e8ba856d8ac","page_size":[595,841],"block_position":"13-1"},{"bbox":[81,139,244,151],"type":"text","angle":0,"index":2,"text":"├── apps/ # 推荐：存放所有自定义应用","id":"0711ded0-b9c9-4510-b1a1-fdd9632deace","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-2"},{"bbox":[81,165,179,176],"type":"text","angle":0,"index":3,"text":"│ └── blog/ # 示例应用","id":"7b6edf65-bb5d-4d76-b1a3-349aa3f61bbe","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-3"},{"bbox":[81,190,230,202],"type":"text","angle":0,"index":4,"text":"├── static/ # 静态文件（CSS/JS/图片）","id":"81e244ee-63f0-4a32-b5fa-6e30ac51beb1","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-4"},{"bbox":[81,217,199,228],"type":"text","angle":0,"index":5,"text":"├── media/ # 用户上传文件","id":"ae15b106-fe67-49e9-ba14-0cb44c9eea53","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-5"},{"bbox":[81,243,205,254],"type":"text","angle":0,"index":6,"text":"├── templates/ # 全局模板目录","id":"f8075971-1782-4074-8444-83944491d67b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-6"},{"bbox":[81,270,212,280],"type":"text","angle":0,"index":7,"text":"└── requirements.txt # 项目依赖列表","id":"d396c16f-9b12-4080-8ffd-3533a1fd898f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-7"},{"bbox":[88,305,251,322],"type":"title","angle":0,"index":9,"text":"# 1. apps/ 目录（推荐结构）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":13,"id":"d4b4bc26-e965-4746-8980-2322a2741635","page_size":[595,841],"block_position":"13-8"},{"bbox":[80,356,230,367],"type":"text","angle":0,"index":10,"text":"将应用集中管理，避免散落在项目根目录。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"id":"7f03847f-f58d-457d-95ec-2d463ec7bdf9","page_size":[595,841],"block_position":"13-9"},{"bbox":[80,382,207,393],"type":"text","angle":0,"index":11,"text":"需在 settings.py 中配置 Python 路径：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"id":"b12621d6-d993-4e55-abb6-47880f112588","page_size":[595,841],"block_position":"13-10"},{"bbox":[80,409,116,418],"type":"text","angle":0,"index":12,"text":"import sys","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"id":"143656d2-dea9-4094-bf90-b2ea9d6014e7","page_size":[595,841],"block_position":"13-11"},{"bbox":[80,434,239,444],"type":"text","angle":0,"index":13,"text":"sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"id":"65ae21c4-15c5-4ccb-bd24-1ca3724c6958","page_size":[595,841],"block_position":"13-12"},{"bbox":[86,470,232,486],"type":"title","angle":0,"index":14,"text":"# 2. 静态文件与媒体文件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":13,"id":"b8ff90e4-17e4-4c90-9747-e9a4af6bf645","page_size":[595,841],"block_position":"13-13"},{"bbox":[105,521,341,532],"type":"text","angle":0,"index":15,"text":"static/：存放 CSS、JavaScript、图片等，通过 STATIC_URL 访问。","id":"576cb22f-d84f-4d3e-9bdb-5cd92da968e1","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-14"},{"bbox":[105,547,459,558],"type":"text","angle":0,"index":16,"text":"media/：用户上传的文件（如头像），通过 MEDIA_URL 访问。需配置服务器在开发时提供访问：","id":"d8007ed0-aa41-4d71-9e55-5213c67f5044","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-15"},{"bbox":[105,573,205,583],"type":"text","angle":0,"index":17,"text":". # urls.py（仅开发环境）","id":"cbebd037-67cc-4795-a660-81a9dec785df","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-16"},{"bbox":[105,600,232,610],"type":"text","angle":0,"index":18,"text":"from django.conf import settings","id":"8599444e-634c-47dc-9089-8c6139f10021","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-17"},{"bbox":[105,626,257,636],"type":"text","angle":0,"index":19,"text":"from django.conf.urls.static import static","id":"f088c150-8afd-4d99-95f6-106f28442300","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-18"},{"bbox":[105,651,112,659],"type":"text","angle":0,"index":20,"text":"","id":"0967e00a-0186-443f-b048-70f1f8d9ab6c","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"page_size":[595,841],"block_position":"13-19"},{"bbox":[80,677,348,688],"type":"text","angle":0,"index":22,"text":"urlpatterns $+ =$ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":13,"id":"84244155-9f6c-46b5-8cd2-eaab84dbc3df","page_size":[595,841],"block_position":"13-20"},{"bbox":[88,735,238,751],"type":"title","angle":0,"index":23,"text":"# 一个项目可以由多个应用","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":13,"id":"c8b33d05-3455-4cc7-a321-843c5b1eca45","page_size":[595,841],"block_position":"13-21"}],[{"bbox":[80,79,120,90],"type":"text","angle":0,"index":0,"text":"myproject/","id":"9d462722-01b0-43ea-9c97-a857cef36c33","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-0"},{"bbox":[81,105,86,116],"type":"text","angle":0,"index":1,"text":"","id":"7a8f7786-e7fe-4d33-b36d-ec8be6723874","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-1"},{"bbox":[81,131,133,142],"type":"text","angle":0,"index":2,"text":"├── manage.py","id":"2488b6b1-800b-48d7-9d72-6b4dafe2af86","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-2"},{"bbox":[81,157,152,169],"type":"text","angle":0,"index":3,"text":"├── requirements.txt","id":"80259958-2ea8-4ed7-ab3a-97489d101c19","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-3"},{"bbox":[81,183,118,194],"type":"text","angle":0,"index":4,"text":"├── static/","id":"f50e0985-2b1a-468a-870d-c59b6f48911b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-4"},{"bbox":[81,210,120,220],"type":"text","angle":0,"index":5,"text":"│ ── css/ ├","id":"2eabc27a-3b04-4d29-b6da-77bb4b94a26a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-5"},{"bbox":[81,235,115,246],"type":"text","angle":0,"index":6,"text":"│ ── js/ ├","id":"60ff9a2f-288e-4d92-a6e9-245f10491e6a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-6"},{"bbox":[81,262,132,272],"type":"text","angle":0,"index":7,"text":"│ └── images/","id":"46d76c0b-f40a-4a47-b9db-0ae742e499c1","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-7"},{"bbox":[81,288,121,298],"type":"text","angle":0,"index":8,"text":"├── media/","id":"662d917a-b57a-44ba-aa1c-b8c1f7d4bb2a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-8"},{"bbox":[81,313,132,324],"type":"text","angle":0,"index":9,"text":"├── templates/","id":"ffc06283-ec0f-418c-862b-d81d9a1bfaa4","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-9"},{"bbox":[81,340,138,350],"type":"text","angle":0,"index":10,"text":"│ └── base.html","id":"cb4b7c15-6e27-4b5e-9ae3-78194c128b99","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-10"},{"bbox":[81,366,132,377],"type":"text","angle":0,"index":11,"text":"└── myproject/","id":"2df95c9d-5679-40af-a096-58e1de2ffb1e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-11"},{"bbox":[89,391,141,403],"type":"text","angle":0,"index":12,"text":"── __init__.py ├","id":"11c42fcd-fb88-4567-af18-7c3e5ed8205f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-12"},{"bbox":[89,417,139,429],"type":"text","angle":0,"index":13,"text":"── settings.py ├","id":"382818a7-1eb6-45a6-ac61-d5ef768bd428","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-13"},{"bbox":[89,444,126,454],"type":"text","angle":0,"index":14,"text":"── urls.py ├","id":"78b92fe1-d0b2-4924-8163-a496da6aecd2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-14"},{"bbox":[89,470,129,481],"type":"text","angle":0,"index":15,"text":"── wsgi.py ├","id":"377275c4-8081-48c8-8010-bfbabc8abf4d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-15"},{"bbox":[89,497,126,507],"type":"text","angle":0,"index":16,"text":"└── asgi.py","id":"8cfd7f8e-ac35-4acb-a605-a7f026dd45da","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-16"},{"bbox":[81,523,126,533],"type":"text","angle":0,"index":17,"text":"└── myapp1/","id":"e16c487d-5b1b-4577-9974-6132f775ad1a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-17"},{"bbox":[89,549,142,559],"type":"text","angle":0,"index":18,"text":"── migrations/├","id":"40e576e0-b5af-493b-a7ac-36e897ad4a87","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-18"},{"bbox":[89,575,139,585],"type":"text","angle":0,"index":19,"text":"── templates/ ├","id":"b0515786-eb90-419e-918c-a0f7d3633677","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-19"},{"bbox":[89,601,142,611],"type":"text","angle":0,"index":20,"text":"│ └── myapp1/","id":"1781a290-ad94-411b-b91c-23fdcd44e0fe","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-20"},{"bbox":[89,627,141,638],"type":"text","angle":0,"index":21,"text":"── __init__.py ├","id":"6b709a16-ed21-4a3d-9b55-d8f1a536133f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-21"},{"bbox":[89,653,135,664],"type":"text","angle":0,"index":22,"text":"── admin.py ├","id":"4b7af8d9-0a91-4618-884d-904c2160ca97","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-22"},{"bbox":[89,678,129,689],"type":"text","angle":0,"index":23,"text":"── apps.py ├","id":"44657b15-0547-453f-8e6c-a0249892cff3","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-23"},{"bbox":[89,704,138,715],"type":"text","angle":0,"index":24,"text":"── models.py ├","id":"821c644e-2f95-4894-82a5-c669c5ca889d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-24"},{"bbox":[89,731,129,742],"type":"text","angle":0,"index":25,"text":"── tests.py ├","id":"2aa0f067-9c57-44f6-ab18-fa74278db5e3","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":14,"page_size":[595,841],"block_position":"14-25"}],[{"bbox":[88,79,127,89],"type":"text","angle":0,"index":0,"text":"── urls.py ├","id":"7a7026a7-8bed-4976-9176-6899cc377b57","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-0"},{"bbox":[88,106,132,116],"type":"text","angle":0,"index":1,"text":"└── views.py","id":"f07e30a7-8809-4415-912f-c894793fa2ec","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-1"},{"bbox":[81,132,126,142],"type":"text","angle":0,"index":3,"text":"└── myapp2/","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"8f96f6c4-851e-4841-88ef-3f4088d0c6de","page_size":[595,841],"block_position":"15-2"},{"bbox":[88,158,148,169],"type":"text","angle":0,"index":4,"text":"└── ... (类似结构)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"dee4ed3c-6256-48bb-8115-f7f5f2318fc7","page_size":[595,841],"block_position":"15-3"},{"bbox":[88,184,122,194],"type":"title","angle":0,"index":5,"text":"# 实践建议","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":15,"id":"df35cf14-08ad-43b7-a56d-e6074dd4361d","page_size":[595,841],"block_position":"15-4"},{"bbox":[105,210,310,221],"type":"text","angle":0,"index":6,"text":"1. 项目与应用分离：保持每个应用的独立性，便于复用","id":"ed0b6897-b2cc-4d13-924d-bb6e1a85e529","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-5"},{"bbox":[105,236,323,247],"type":"text","angle":0,"index":7,"text":"2. 环境配置：使用不同的 settings 文件区分开发和生产环境","id":"f1d83edd-9031-4283-835f-01b9b1187de9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-6"},{"bbox":[105,262,368,273],"type":"text","angle":0,"index":8,"text":"3. 静态文件管理：开发时使用 STATICFILES_DIRS，生产时使用 collectstatic","id":"6fd49d49-ee58-4582-8029-b82264e4284d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-7"},{"bbox":[105,289,315,299],"type":"text","angle":0,"index":9,"text":"4. URL 设计：在应用级别定义 URL，然后在项目级别包含","id":"9c116ce7-13b0-430a-92d8-310fd8c4d0b9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-8"},{"bbox":[105,314,278,325],"type":"text","angle":0,"index":10,"text":"5. 模板组织：为每个应用创建子目录存放模板","id":"010a987b-7527-4463-b30f-249e263b9054","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"page_size":[595,841],"block_position":"15-9"},{"bbox":[87,340,181,352],"type":"title","angle":0,"index":12,"text":"# 生产环境vs 开发环境差异","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":15,"id":"917fc7d5-3f1e-4b22-a8c4-e6959ef627c8","page_size":[595,841],"block_position":"15-10"},{"bbox":[88,364,594,553],"index":13,"angle":0,"type":"table_body","img_path":"/","id":"4a9abdde-5e63-4476-9db8-bb37e28d9a9e","color":{"line":"rgba(103, 194, 63, 1)","fill":"rgba(103, 194, 63, 1)"},"table_body":"<table><tr><td>文件/配置</td><td>开发环境</td><td>生产环境</td></tr><tr><td>DEBUG</td><td>True（显示错误详情）</td><td>False（隐藏错误，记录到日志）</td></tr><tr><td>数据库</td><td>SQLite（默认）</td><td>PostgreSQL/MySQL（性能优化）</td></tr><tr><td>静态文件</td><td>runserver 自动服务</td><td>使用 collectstatic 收集到 CDN</td></tr><tr><td>ALLOWED_HOSTS</td><td>空列表或 [&#x27;localhost&#x27;]</td><td>必须配置域名（如 [&#x27;example.com&#x27;])</td></tr></table>","page_idx":15,"page_size":[595,841],"block_position":"15-11"},{"bbox":[88,585,184,608],"type":"title","angle":0,"index":14,"text":"# path() 函数","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":15,"id":"31f07e8c-52fc-489d-a437-a987118e44c2","page_size":[595,841],"block_position":"15-12"},{"bbox":[87,613,456,625],"type":"text","angle":0,"index":15,"text":"Django path() 可以接收四个参数，分别是两个必选参数：route、view 和两个可选参数：kwargs、name。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"2d502ddf-2530-463a-8c83-3df6a2893bcd","page_size":[595,841],"block_position":"15-13"},{"bbox":[88,629,121,640],"type":"text","angle":0,"index":16,"text":"语法格式：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"c8cb8da1-8824-449b-a7cb-04418c0b52da","page_size":[595,841],"block_position":"15-14"},{"bbox":[88,654,274,664],"type":"text","angle":0,"index":17,"text":"path(route, view, kwargs=None, name=None)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"c62e96af-f81e-471f-af8c-ce91f156e1c6","page_size":[595,841],"block_position":"15-15"},{"bbox":[86,678,504,704],"type":"text","angle":0,"index":18,"text":"route：字符串，定义URL 的路径部分。可以包含变量，例如<int:my_variable>，以从URL 中捕获参数并将其传递给视图函数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"1a311c66-6008-4dd6-b0f0-d15de6baadcf","page_size":[595,841],"block_position":"15-16"},{"bbox":[87,709,392,720],"type":"text","angle":0,"index":19,"text":"view：视图函数，处理与给定路由匹配的请求。可以是一个函数或一个基于类的视图。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"4e4183af-2801-4bf2-b8d8-29f3ebae4b9b","page_size":[595,841],"block_position":"15-17"},{"bbox":[87,725,338,736],"type":"text","angle":0,"index":20,"text":"kwargs（可选）：一个字典，包含传递给视图函数的额外关键字参数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":15,"id":"3c895c5b-8b75-49fd-b5d3-790b041ce517","page_size":[595,841],"block_position":"15-18"}],[{"bbox":[86,79,505,106],"type":"text","angle":0,"index":0,"text":"name（可选）：为URL 路由指定一个唯一的名称，以便在代码的其他地方引用它。这对于在模板中生成URL 或在代码中进行重定向等操作非常有用。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"3ad6826c-ddad-4130-b800-baa1060199be","page_size":[595,841],"block_position":"16-0"},{"bbox":[87,111,326,122],"type":"text","angle":0,"index":1,"text":"这样我们就完成了使用模板来输出数据，从而实现数据与视图分离。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"178a84b6-9570-4da1-8e8d-a96cb027f025","page_size":[595,841],"block_position":"16-1"},{"bbox":[87,126,255,137],"type":"text","angle":0,"index":2,"text":"接下来我们将具体介绍模板中常用的语法规则。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"9f69bcde-f259-446a-aaed-04b571c2d144","page_size":[595,841],"block_position":"16-2"},{"bbox":[88,163,196,187],"type":"title","angle":0,"index":3,"text":"# Django 模板","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":16,"id":"53d18ac2-86bd-48a3-93af-3bc56f67628c","page_size":[595,841],"block_position":"16-3"},{"bbox":[86,194,500,221],"type":"text","angle":0,"index":4,"text":"Django 的模板系统（Template System）是用于将业务逻辑（Python）与展示层（HTML）分离的核心组件，它允许开发者通过简单的标签和变量动态生成 HTML 页面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"e22a24d8-82fd-4684-b535-8b1517e51946","page_size":[595,841],"block_position":"16-4"},{"bbox":[86,227,502,254],"type":"text","angle":0,"index":5,"text":"在上一章节中我们使用 django.http.HttpResponse() 来输出 \"Hello World！\"，该方式将数据与视图混合在一起，不符合 Django 的 MVT 思想。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"7fc4d341-fd66-4939-b6c3-9b7a1a9fc2b0","page_size":[595,841],"block_position":"16-5"},{"bbox":[87,260,451,272],"type":"text","angle":0,"index":6,"text":"本章节我们将为大家详细介绍Django 模板的应用，模板是一个文本，用于分离文档的表现形式和内容。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"a58ff60d-1e61-48c6-8f57-0e3b8610c327","page_size":[595,841],"block_position":"16-6"},{"bbox":[88,277,595,439],"index":7,"angle":0,"type":"table_body","img_path":"/","id":"e23b7047-5708-493a-8fb0-95355461a325","color":{"line":"rgba(103, 194, 63, 1)","fill":"rgba(103, 194, 63, 1)"},"table_body":"<table><tr><td>功能</td><td>语法/示例</td><td>适用场景</td></tr><tr><td>变量渲染</td><td>{\\ variable }</td><td>动态显示数据</td></tr><tr><td>逻辑控制</td><td>{% if %}, {% for %}</td><td>条件/循环渲染</td></tr><tr><td>模板继承</td><td>{% extends %}, {% block %}</td><td>避免重复 HTML 结构</td></tr><tr><td>静态文件</td><td>{% static &#x27;path&#x27; %}</td><td>加载 CSS/JS/图片</td></tr><tr><td>自定义过滤器</td><td>@register.filter</td><td>扩展模板功能</td></tr></table>","page_idx":16,"page_size":[595,841],"block_position":"16-7"},{"bbox":[88,486,232,511],"type":"title","angle":0,"index":8,"text":"# Django 模板标签","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":16,"id":"221c15d2-97f7-4e83-9704-e27f6569e22d","page_size":[595,841],"block_position":"16-8"},{"bbox":[88,523,120,539],"type":"title","angle":0,"index":9,"text":"# 变量","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":16,"id":"27339310-e334-480b-a877-96578cd7b5de","page_size":[595,841],"block_position":"16-9"},{"bbox":[88,550,126,562],"type":"text","angle":0,"index":10,"text":"模板语法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"c6eca04a-3a62-4301-9102-70dd314f3798","page_size":[595,841],"block_position":"16-10"},{"bbox":[88,575,246,587],"type":"text","angle":0,"index":11,"text":"view：｛\"HTML 变量名\" : \"views 变量名\"｝","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"c49d765c-551b-4bef-83c4-111b7d466721","page_size":[595,841],"block_position":"16-11"},{"bbox":[88,599,164,611],"type":"text","angle":0,"index":12,"text":"HTML：｛｛变量名｝｝","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"da8b8746-c61c-406f-aab2-d08b8d1e2836","page_size":[595,841],"block_position":"16-12"},{"bbox":[88,629,127,647],"type":"title","angle":0,"index":13,"text":"# 列表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":16,"id":"024de4f1-642a-4d19-ad40-dd2a55f49c51","page_size":[595,841],"block_position":"16-13"},{"bbox":[87,658,329,670],"type":"text","angle":0,"index":14,"text":"templates 中的 runoob.html 中，可以用 . 索引下标取出对应的元素。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"64d092ce-df34-4d91-a9a3-aee32fe8ccfc","page_size":[595,841],"block_position":"16-14"},{"bbox":[87,673,281,686],"type":"text","angle":0,"index":15,"text":"HelloWorld/HelloWorld/views.py 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":16,"id":"d7c778e6-cb69-49b6-9d4e-3c87ed5a815a","page_size":[595,841],"block_position":"16-15"},{"bbox":[88,692,402,751],"index":16,"angle":0,"type":"code","text":"```python\nfrom django.shortcuts import render  \ndef runoob(request):  \n    views_list = [\"菜鸟教程1\", \"菜鸟教程2\", \"菜鸟教程3\"]  \n    return render(request, \"runoob.html\", {\"views_list\": views_list})\n```","id":"a3c42d91-85d3-4e65-aee0-699601128892","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":16,"page_size":[595,841],"block_position":"16-16"}],[{"bbox":[87,79,296,90],"type":"text","angle":0,"index":0,"text":"templates 中的 runoob.html 中，可以用 .键 取出对应的值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"4edc356f-0dec-466b-a3d6-71b2e50cfb5a","page_size":[595,841],"block_position":"17-0"},{"bbox":[87,103,134,120],"type":"title","angle":0,"index":1,"text":"# 过滤器","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":17,"id":"1f06a05a-09a9-4b8b-a598-69c0309ce781","page_size":[595,841],"block_position":"17-1"},{"bbox":[87,132,121,142],"type":"text","angle":0,"index":2,"text":"模板语法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"07182b0f-2132-45b8-ac0e-94609a7e7bde","page_size":[595,841],"block_position":"17-2"},{"bbox":[88,156,211,167],"type":"text","angle":0,"index":3,"text":"{{ 变量名 | 过滤器：可选参数 }}","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"460894ef-df35-4677-92cc-c8c8c3af0cb2","page_size":[595,841],"block_position":"17-3"},{"bbox":[87,180,349,191],"type":"text","angle":0,"index":4,"text":"模板过滤器可以在变量被显示前修改它，过滤器使用管道字符，如下所示：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"a77d6ce8-bf66-4073-a451-7c6b0a9cfa1e","page_size":[595,841],"block_position":"17-4"},{"bbox":[88,196,107,205],"type":"text","angle":0,"index":5,"text":"safe","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"9ea8a82f-2136-471b-b853-756c513a8a6d","page_size":[595,841],"block_position":"17-5"},{"bbox":[87,211,213,222],"type":"text","angle":0,"index":6,"text":"将字符串标记为安全，不需要转义。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"b1906514-2b44-4e96-95f8-313cf654187d","page_size":[595,841],"block_position":"17-6"},{"bbox":[87,227,280,238],"type":"text","angle":0,"index":7,"text":"要保证 views.py 传过来的数据绝对安全，才能用 safe。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"3b7772cc-665f-480d-af08-8b9989dcc98e","page_size":[595,841],"block_position":"17-7"},{"bbox":[87,243,233,253],"type":"text","angle":0,"index":8,"text":"和后端 views.py 的 mark_safe 效果相同。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"a2a9897c-537c-4a25-9402-277c86e721a5","page_size":[595,841],"block_position":"17-8"},{"bbox":[86,259,497,269],"type":"text","angle":0,"index":9,"text":"Django 会自动对 views.py 传到HTML文件中的标签语法进行转义，令其语义失效。加safe 过滤器是告诉Django 该","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"71328acb-2f42-4496-8c29-f9b484a8b22f","page_size":[595,841],"block_position":"17-9"},{"bbox":[87,275,301,285],"type":"text","angle":0,"index":10,"text":"数据是安全的，不必对其进行转义，可以让该数据语义生效。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"931d97e6-a358-4d38-aead-ce737eeaaa2f","page_size":[595,841],"block_position":"17-10"},{"bbox":[87,297,164,314],"type":"title","angle":0,"index":11,"text":"# if/else 标签","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":17,"id":"cb0314fb-e6fb-49cf-921d-1158233c325f","page_size":[595,841],"block_position":"17-11"},{"bbox":[87,325,158,336],"type":"text","angle":0,"index":12,"text":"基本语法格式如下：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"10159959-38b8-4854-b5cf-d48cb45f975a","page_size":[595,841],"block_position":"17-12"},{"bbox":[88,349,213,386],"index":13,"angle":0,"type":"algorithm","text":"$\\{\\% \\text{if condition}\\}$  display{ $\\%$ endif}","id":"0dd281f7-0885-4fcd-8c1f-dccbcfb3fbbe","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"page_size":[595,841],"block_position":"17-13"},{"bbox":[87,399,110,409],"type":"text","angle":0,"index":14,"text":"或者：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"5855037f-5866-4a1c-a019-d5be78bfb220","page_size":[595,841],"block_position":"17-14"},{"bbox":[88,423,257,508],"index":15,"angle":0,"type":"algorithm","text":"$\\{\\%$  if condition1  $\\}$  . display 1{% elif condition2  $\\}$  . display 2{% else  $\\}$  display 3{%endif  $\\}$","id":"12141c77-ec40-4d18-aa24-3053f4773d86","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"page_size":[595,841],"block_position":"17-15"},{"bbox":[87,523,236,533],"type":"text","angle":0,"index":16,"text":"根据条件判断是否输出。if/else 支持嵌套。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"a1e144d4-5767-4b2e-b512-2945868c12ca","page_size":[595,841],"block_position":"17-16"},{"bbox":[87,538,434,550],"type":"text","angle":0,"index":17,"text":"$\\{ \\%$ if %} 标签接受 and ， or 或者 not 关键字来对多个变量做判断 ，或者对变量取反（ not )，例如：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"3b3acd14-83bc-464b-9e09-df8675e0c15c","page_size":[595,841],"block_position":"17-17"},{"bbox":[88,561,310,598],"index":18,"angle":0,"type":"algorithm","text":"$\\{\\%$  if athlete_list and coach_list  $\\}$  athletes和coaches变量都是可用的。  $\\{\\%$ endif  $\\}$","id":"afb52186-592e-4446-b03d-e628b77df42d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"page_size":[595,841],"block_position":"17-18"},{"bbox":[87,612,340,622],"type":"text","angle":0,"index":19,"text":"遍历字典: 可以直接用字典.items 方法，用变量的解包分别获取键和值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"7a410f72-2bb0-42f6-a728-4d056f858b68","page_size":[595,841],"block_position":"17-19"},{"bbox":[87,666,142,682],"type":"title","angle":0,"index":20,"text":"# for 标签","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":17,"id":"35d3ee89-ab95-4b03-b535-0083d3931347","page_size":[595,841],"block_position":"17-20"},{"bbox":[87,694,224,705],"type":"text","angle":0,"index":21,"text":"$\\{ \\%$ for $\\% \\}$ 允许我们在一个序列上迭代。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"49d0dc80-5ac9-46ae-bf7c-cbfdd774798f","page_size":[595,841],"block_position":"17-21"},{"bbox":[86,710,498,735],"type":"text","angle":0,"index":22,"text":"与 Python 的 for 语句的情形类似，循环语法是 for X in Y ，Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"2bb405c0-0d2e-438a-8282-13043ca27ef8","page_size":[595,841],"block_position":"17-22"},{"bbox":[87,741,386,752],"type":"text","angle":0,"index":23,"text":"每一次循环中，模板系统会渲染在 $6 \\%$ for $\\% 3$ 和 $6 \\%$ endfor $\\% 3$ 之间的所有内容。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":17,"id":"9d71398d-94e5-4912-93da-24cb24f60a0b","page_size":[595,841],"block_position":"17-23"}],[{"bbox":[87,80,361,89],"type":"text","angle":0,"index":0,"text":"例如，给定一个运动员列表 athlete_list 变量，我们可以使用下面的代码来显示这个列表：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"26530b04-b175-476b-889e-bda478e39a68","page_size":[595,841],"block_position":"18-0"},{"bbox":[87,95,139,105],"type":"text","angle":0,"index":1,"text":"{% empty %}","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"48c80312-0143-4ef2-9362-2cbd52f685dd","page_size":[595,841],"block_position":"18-1"},{"bbox":[87,111,399,121],"type":"text","angle":0,"index":2,"text":"可选的 {% empty $\\% \\}$ 从句：在循环为空的时候执行（即 in 后面的参数布尔值为 False ）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"a048c0ad-8e76-48cd-8dab-354f98db3468","page_size":[595,841],"block_position":"18-2"},{"bbox":[88,134,148,151],"type":"title","angle":0,"index":3,"text":"# 注释标签","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":18,"id":"3ee8dcf1-3ddc-4d9b-87c9-6b8703f198b4","page_size":[595,841],"block_position":"18-3"},{"bbox":[87,163,170,174],"type":"text","angle":0,"index":4,"text":"Django 注释使用 {# #}。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"b2645dc5-b9ec-48cc-92c2-ee7dc49e8a08","page_size":[595,841],"block_position":"18-4"},{"bbox":[88,186,160,197],"type":"text","angle":0,"index":5,"text":"{# 这是一个注释 #}","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"51717871-380f-4b79-a6fc-56528ff17fa6","page_size":[595,841],"block_position":"18-5"},{"bbox":[88,216,174,234],"type":"title","angle":0,"index":6,"text":"# include 标签","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":18,"id":"8522ca27-f3c6-44b3-a74d-121f7401d2a1","page_size":[595,841],"block_position":"18-6"},{"bbox":[87,245,289,256],"type":"text","angle":0,"index":7,"text":"{% include %} 标签允许在模板中包含其它的模板的内容。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"f8f7fe7e-4d06-44db-ab88-3c11efe259b5","page_size":[595,841],"block_position":"18-7"},{"bbox":[88,261,223,271],"type":"text","angle":0,"index":8,"text":"下面这个例子都包含了 nav.html 模板：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"c0bf36ee-ba3f-4368-8d45-5723566dc5a8","page_size":[595,841],"block_position":"18-8"},{"bbox":[88,285,198,296],"type":"text","angle":0,"index":9,"text":"{% include \"nav.html\" %}","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"1baa88ba-8631-47e4-837d-435550400368","page_size":[595,841],"block_position":"18-9"},{"bbox":[88,314,183,333],"type":"title","angle":0,"index":10,"text":"# csrf_token","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":18,"id":"62576f46-ed91-4c45-bc24-651f492a5d80","page_size":[595,841],"block_position":"18-10"},{"bbox":[87,343,287,353],"type":"text","angle":0,"index":11,"text":"csrf_token 用于form表单中，作用是跨站请求伪造保护。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"a39e771b-39e0-47f2-8a4a-117430943579","page_size":[595,841],"block_position":"18-11"},{"bbox":[87,358,407,368],"type":"text","angle":0,"index":12,"text":"如果不用 $\\{ \\%$ csrf_token $\\% \\}$ 标签，在用 form 表单时，要再次跳转页面会报403 权限错误。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"4da45cb9-cab7-4a56-bc6b-16f0b2938ae9","page_size":[595,841],"block_position":"18-12"},{"bbox":[87,374,324,384],"type":"text","angle":0,"index":13,"text":"用了{% csrf_token %} 标签，在 form 表单提交数据时，才会成功。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"8dd25d9e-57ea-417b-ac9d-2cef8ed9cb98","page_size":[595,841],"block_position":"18-13"},{"bbox":[89,394,257,415],"type":"title","angle":0,"index":14,"text":"# 自定义标签和过滤器","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":18,"id":"219a2792-bb69-4b41-acbd-c146f335f28f","page_size":[595,841],"block_position":"18-14"},{"bbox":[87,423,423,433],"type":"text","angle":0,"index":15,"text":"1、在应用目录下创建 templatetags 目录(与 templates 目录同级，目录名只能是 templatetags)","id":"04d3ca25-cbb6-43bc-836c-d33c70ba9c5d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"page_size":[595,841],"block_position":"18-15"},{"bbox":[87,439,249,449],"type":"text","angle":0,"index":16,"text":"4、利用装饰器 $@$ register.filter 自定义过滤器。","id":"f7a44a35-043e-408c-a18c-7186b73f8c56","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"page_size":[595,841],"block_position":"18-16"},{"bbox":[87,454,221,464],"type":"text","angle":0,"index":18,"text":"注意：装饰器的参数最多只能有 2 个。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"9298e95a-8567-4ffc-a8c3-f01bcd0d59a4","page_size":[595,841],"block_position":"18-17"},{"bbox":[87,470,249,480],"type":"text","angle":0,"index":19,"text":"4、利用装饰器 @register.filter 自定义过滤器。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"40341d1a-7e6c-4439-aab7-512708e1e068","page_size":[595,841],"block_position":"18-18"},{"bbox":[87,485,221,495],"type":"text","angle":0,"index":20,"text":"注意：装饰器的参数最多只能有 2 个。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"e648004a-dfab-4e4c-b8e5-22ee3b32cc34","page_size":[595,841],"block_position":"18-19"},{"bbox":[88,508,260,520],"type":"text","angle":0,"index":21,"text":"@register.filterdef my_filter(v1, v2):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"901d9994-a142-4386-9936-23edb7bff3dc","page_size":[595,841],"block_position":"18-20"},{"bbox":[106,534,171,543],"type":"text","angle":0,"index":22,"text":"return v1 * v2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"d88f43d2-52f0-4f19-8dea-c4e99d1539fe","page_size":[595,841],"block_position":"18-21"},{"bbox":[87,559,265,570],"type":"text","angle":0,"index":23,"text":"5、利用装饰器 @register.simple_tag 自定义标签。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"879096ba-017d-43a3-8e5a-27e6057331c8","page_size":[595,841],"block_position":"18-22"},{"bbox":[88,579,201,599],"type":"title","angle":0,"index":24,"text":"# 配置静态文件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":18,"id":"56675919-fc62-4845-8473-395c9b9b4d6a","page_size":[595,841],"block_position":"18-23"},{"bbox":[87,608,220,618],"type":"text","angle":0,"index":25,"text":"1、在项目根目录下创建 statics 目录。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"de9509d6-71b9-4db4-990c-db8b7b5062d2","page_size":[595,841],"block_position":"18-24"},{"bbox":[88,620,217,729],"index":26,"angle":0,"type":"image","img_path":"/7a0bccfdc891cb8db6929d9ee4656cf5853f50e3339e9658e86f85cd0a8ec3cd.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.21680672268907564,"page_idx":18,"id":"f69e66af-d4ba-4b10-b357-eddea48fccb9","page_size":[595,841],"block_position":"18-25"},{"bbox":[87,733,257,743],"type":"text","angle":0,"index":27,"text":"2、在 settings 文件的最下方配置添加以下配置：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":18,"id":"bbc67140-a355-411e-859a-6167e579d7e4","page_size":[595,841],"block_position":"18-26"}],[{"bbox":[88,79,270,139],"index":0,"angle":0,"type":"algorithm","text":"STATIC_url  $=$  \"/static/'#别名  \nSTATICFILES_DIRS  $=$  [os.path.join(Base_DIR，\"statics\")，]","id":"f59d2c56-9e00-4c14-8db5-0e274348b9be","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-0"},{"bbox":[86,153,492,163],"type":"text","angle":0,"index":1,"text":"3、在 statics 目录下创建 css 目录，js 目录，images 目录，plugins 目录， 分别放 css 文件，js 文件，图片，插件。","id":"097720b9-8857-474e-8ee3-872ec9fa4e22","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-1"},{"bbox":[87,169,242,179],"type":"text","angle":0,"index":2,"text":"4、把 bootstrap 框架放入插件目录 plugins。","id":"c2c43f00-e96d-46ab-8b10-2c49ff34d4c8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-2"},{"bbox":[87,185,260,195],"type":"text","angle":0,"index":3,"text":"5、在 HTML 文件的 head 标签中引入 bootstrap。","id":"d4ad066d-ec46-40a2-8580-a6afaf11a851","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-3"},{"bbox":[87,200,354,211],"type":"text","angle":0,"index":5,"text":"注意：此时引用路径中的要用配置文件中的别名static，而不是目录 statics。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"37d314a6-5731-48e0-9626-8d15d8555641","page_size":[595,841],"block_position":"19-4"},{"bbox":[87,237,164,258],"type":"title","angle":0,"index":6,"text":"# 模板继承","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":19,"id":"05317c86-764d-4777-aba4-9e109a3980e5","page_size":[595,841],"block_position":"19-5"},{"bbox":[86,267,269,277],"type":"text","angle":0,"index":7,"text":"模板可以用继承的方式来实现复用，减少冗余内容。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"bbf22479-e512-4576-96bb-aabb52045b3b","page_size":[595,841],"block_position":"19-6"},{"bbox":[87,283,364,293],"type":"text","angle":0,"index":8,"text":"网页的头部和尾部内容一般都是一致的，我们就可以通过模板继承来实现复用。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"f5201cc2-1fbd-429b-a387-8f4072e20a45","page_size":[595,841],"block_position":"19-7"},{"bbox":[87,299,388,309],"type":"text","angle":0,"index":9,"text":"父模板用于放置可重复利用的内容，子模板继承父模板的内容，并放置自己的内容。。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"ce1b4f36-e74a-4390-b02d-8a76af520dc1","page_size":[595,841],"block_position":"19-8"},{"bbox":[88,322,133,338],"type":"title","angle":0,"index":10,"text":"# 父模板","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":19,"id":"7aa231f9-945f-482d-ad8a-88a4f78392de","page_size":[595,841],"block_position":"19-9"},{"bbox":[86,350,489,361],"type":"text","angle":0,"index":11,"text":"标签 block...endblock: 父模板中的预留区域，该区域留给子模板填充差异性的内容，不同预留区域名字不能相同。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"5ad4491a-06e2-4788-821c-e154c33f68a2","page_size":[595,841],"block_position":"19-10"},{"bbox":[88,375,394,386],"index":12,"angle":0,"type":"algorithm","text":"$\\{\\% \\text{block} \\text{名称} \\% \\}$  预留给子模板的区域，可以设置设置默认内容  $\\{\\% \\text{endblock} \\text{名称} \\% \\}$","id":"64dd4376-c454-411f-9d72-448b4000f7c0","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-11"},{"bbox":[88,404,133,421],"type":"title","angle":0,"index":13,"text":"# 子模板","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":19,"id":"8f2fd821-373b-4b81-93c9-65b2b7f90a5e","page_size":[595,841],"block_position":"19-12"},{"bbox":[88,433,221,444],"type":"text","angle":0,"index":14,"text":"子模板使用标签extends 继承父模板：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"adb01be1-b617-4815-b268-713e9ea0ff2c","page_size":[595,841],"block_position":"19-13"},{"bbox":[88,458,194,468],"index":15,"angle":0,"type":"code","text":"```txt\n% extends \"父模板路径\"%}\n```","id":"df0c94cc-512a-4782-ac60-444141de9590","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-14"},{"bbox":[87,482,476,492],"type":"text","angle":0,"index":16,"text":"子模板如果没有设置父模板预留区域的内容，则使用在父模板设置的默认内容，当然也可以都不设置，就为空。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"70ec0ecd-e5ba-403a-8547-16347198e238","page_size":[595,841],"block_position":"19-15"},{"bbox":[88,497,213,507],"type":"text","angle":0,"index":17,"text":"子模板设置父模板预留区域的内容：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"e368b259-954f-4a66-8be7-4ac4ba6da869","page_size":[595,841],"block_position":"19-16"},{"bbox":[88,523,267,533],"index":18,"angle":0,"type":"algorithm","text":"{  $\\%$  block名称  $\\%$  }内容{  $\\%$  endblock名称  $\\%$  }","id":"720aa0aa-ae6b-4314-aca1-aeca156faf23","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-17"},{"bbox":[87,547,196,557],"type":"text","angle":0,"index":19,"text":"Django 模型使用自带的 ORM。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"98fa2fb9-8fbc-4f7e-bf84-b366e4b6ce4a","page_size":[595,841],"block_position":"19-18"},{"bbox":[86,565,502,591],"type":"text","angle":0,"index":20,"text":"对象关系映射（Object Relational Mapping，简称ORM ）用于实现面向对象编程语言里不同类型系统的数据之间的转换。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"8a640f7b-0816-46e7-a49a-88f4282bb81b","page_size":[595,841],"block_position":"19-19"},{"bbox":[87,598,282,608],"type":"text","angle":0,"index":21,"text":"ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"ed91f2ec-47ef-4483-9f1f-3874d812b042","page_size":[595,841],"block_position":"19-20"},{"bbox":[87,616,433,627],"type":"text","angle":0,"index":22,"text":"ORM 是通过使用描述对象和数据库之间的映射的元数据，将程序中的对象自动持久化到数据库中。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"2e7a813f-37aa-4ea3-9918-ad9f10d7059d","page_size":[595,841],"block_position":"19-21"},{"bbox":[88,650,145,661],"type":"text","angle":0,"index":23,"text":"ORM 解析过程:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"id":"79de4af2-7c72-4248-ba8a-c55531252084","page_size":[595,841],"block_position":"19-22"},{"bbox":[80,666,240,676],"type":"text","angle":0,"index":24,"text":"1、ORM 会将 Python 代码转成为 SQL 语句。","id":"8f24e880-90cf-4910-9302-b7ae8d0df720","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-23"},{"bbox":[80,692,252,702],"type":"text","angle":0,"index":25,"text":"2、SQL 语句通过 pymysql 传送到数据库服务端。","id":"1f056cb4-ea44-44b3-bd5d-739e2a12565b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-24"},{"bbox":[80,718,238,728],"type":"text","angle":0,"index":26,"text":"3、在数据库中执行 SQL 语句并将结果返回。","id":"f846eaa4-b7d5-42a7-9b23-d255b1e85197","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":19,"page_size":[595,841],"block_position":"19-25"}],[{"bbox":[94,77,573,184],"index":0,"angle":0,"type":"image","img_path":"/89ff050f91c03b4570c077c1d5a0b35eba5235ff5bcb76f7b6a8328a7ce6d1c7.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.8050420168067227,"page_idx":20,"id":"1f966b96-9c0f-482d-b7d6-d0cb3caac06c","page_size":[595,841],"block_position":"20-0"},{"bbox":[88,200,153,210],"type":"text","angle":0,"index":1,"text":"ORM 对应关系表：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"c8167d20-f2de-4187-b050-137bcee95d77","page_size":[595,841],"block_position":"20-1"},{"bbox":[115,247,472,417],"index":2,"angle":0,"type":"image","img_path":"/e3b1faa6363d2686aa3e435194c96d28a466d037563692d969fb0f4eb9f90257.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.6,"page_idx":20,"id":"fda72085-7eff-4dcb-87c5-a148e289b335","page_size":[595,841],"block_position":"20-2"},{"bbox":[88,470,130,480],"type":"title","angle":0,"index":3,"text":"# 数据库配置","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":20,"id":"f0b559f7-9630-43cb-8bed-2db6b8b8d4e0","page_size":[595,841],"block_position":"20-3"},{"bbox":[87,496,261,507],"type":"text","angle":0,"index":4,"text":"ORM 无法操作到数据库级别，只能操作到数据表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"8fba35e7-0199-4a18-9c3f-1e61f0fc7e0f","page_size":[595,841],"block_position":"20-4"},{"bbox":[87,548,348,559],"type":"text","angle":0,"index":5,"text":"我们在项目的 settings.py 文件中找到 DATABASES 配置项，将其信息修改为：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"0269af2e-a292-4e14-9459-084a783ef1b1","page_size":[595,841],"block_position":"20-5"},{"bbox":[87,574,247,585],"type":"text","angle":0,"index":6,"text":"HelloWorld/HelloWorld/settings.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"af3091bd-7d44-491f-9ae8-36d9be6d33b0","page_size":[595,841],"block_position":"20-6"},{"bbox":[86,600,505,643],"type":"text","angle":0,"index":7,"text":"DATABASES $=$ { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数 据 库 引 擎 'NAME': 'runoob', # 数 据 库 名 称 'HOST':'127.0.0.1', # 数据库地址，本机 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root', # 数据库用户名 'PASSWORD': '123456',# 数据库密码 } }","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"a014ab9a-9c2f-4db8-a195-1d49d908fc51","page_size":[595,841],"block_position":"20-7"},{"bbox":[86,657,505,683],"type":"text","angle":0,"index":8,"text":"上面包含数据库名称和用户的信息，它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置，与 MySQL中相应的数据库和用户连接起来。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"a86f295f-b2aa-40cc-969d-83490d2589c7","page_size":[595,841],"block_position":"20-8"},{"bbox":[87,699,292,710],"type":"text","angle":0,"index":9,"text":"接下来，告诉 Django 使用 pymysql 模块连接 mysql 数据库：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":20,"id":"5cb404f2-10e1-4aa6-a80f-74f46f77ea77","page_size":[595,841],"block_position":"20-9"},{"bbox":[88,725,107,735],"type":"title","angle":0,"index":10,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":20,"id":"2271a6bf-c932-46af-91b7-cb9deea33ae8","page_size":[595,841],"block_position":"20-10"}],[{"bbox":[86,79,318,92],"type":"text","angle":0,"index":0,"text":"# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"91ffe632-9f5c-472b-a9f4-3e04a82fd6ba","page_size":[595,841],"block_position":"21-0"},{"bbox":[87,95,142,105],"type":"text","angle":0,"index":1,"text":"import pymysql","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"b1c72370-597a-43ba-bda9-c0950d38311e","page_size":[595,841],"block_position":"21-1"},{"bbox":[87,111,189,121],"type":"text","angle":0,"index":2,"text":"pymysql.install_as_MySQLdb()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"75b2ce69-04d5-4fa9-b02d-f9308de2c13b","page_size":[595,841],"block_position":"21-2"},{"bbox":[87,184,164,205],"type":"title","angle":0,"index":3,"text":"# 定义模型","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":21,"id":"22328748-eba0-4c28-a801-b7777401e525","page_size":[595,841],"block_position":"21-3"},{"bbox":[87,220,152,236],"type":"title","angle":0,"index":4,"text":"# 创建 APP","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":21,"id":"0508aa71-10e4-4529-b716-516038ee0166","page_size":[595,841],"block_position":"21-4"},{"bbox":[86,248,447,259],"type":"text","angle":0,"index":5,"text":"Django 规定，如果要使用模型，必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"10b9bded-ee64-46f0-a2d3-3c31f8e98147","page_size":[595,841],"block_position":"21-5"},{"bbox":[87,272,230,283],"index":6,"angle":0,"type":"code","text":"```txt\ndjango-admin startapp TestModel\n```","id":"60836ed0-4478-4dce-be87-bb4a86ccdfb1","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-6"},{"bbox":[87,297,420,323],"index":7,"angle":0,"type":"code","text":"```python\n# models.py from django.db import models class Test(model.Model): name = models.CharField(max_length=20)\n```","id":"fc80bc40-6889-4176-9f61-0f4a09e5309d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-7"},{"bbox":[86,328,494,356],"type":"text","angle":0,"index":8,"text":"以上的类名代表了数据库表名，且继承了models.Model，类里面的字段代表数据表中的字段(name)，数据类型则由CharField（相当于 varchar）、DateField（相当于 datetime）， max_length 参数限定长度。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"ee03c338-bbc5-4c42-9ddd-80e6650988e7","page_size":[595,841],"block_position":"21-8"},{"bbox":[87,360,149,370],"type":"text","angle":0,"index":9,"text":"在命令行中运行：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"ded1c5d1-9948-4805-85b4-95c0d6d29626","page_size":[595,841],"block_position":"21-9"},{"bbox":[87,385,273,395],"index":10,"angle":0,"type":"code","text":"```txt\n$ python3 manage.py migrate # 创建表结构\n```","id":"5991ed86-7269-4fa8-b8c9-806ce5f9aa01","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-10"},{"bbox":[87,409,462,420],"index":11,"angle":0,"type":"code","text":"```txt\n$ python3 manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更\n```","id":"2927800b-4a7f-432b-8a6e-f3ff10830e24","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-11"},{"bbox":[87,434,317,445],"index":12,"angle":0,"type":"code","text":"```txt\n$ python3 manage.py migrate TestModel # 创建表结构\n```","id":"b0552962-dd8d-484b-84f0-322d79d158d2","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-12"},{"bbox":[86,457,362,470],"type":"text","angle":0,"index":13,"text":"看到几行 \"Creating table…\" 的字样，你的数据表就创建好了。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"4330ff11-c12c-4d2a-b48c-05d060c37006","page_size":[595,841],"block_position":"21-13"},{"bbox":[87,474,164,485],"type":"text","angle":0,"index":14,"text":"Creating tables ...","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"b0b7cf43-d5a9-41f7-a679-f85b1014abbe","page_size":[595,841],"block_position":"21-14"},{"bbox":[86,505,301,517],"type":"text","angle":0,"index":16,"text":"Creating table TestModel_test #我们自定义的表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"37e00ba8-71d6-40af-b230-779c4894bf26","page_size":[595,841],"block_position":"21-15"},{"bbox":[86,535,343,549],"type":"text","angle":0,"index":18,"text":"表名组成结构为：应用名_类名（如：TestModel_test）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"32662140-a187-45ef-86fa-09f999df3739","page_size":[595,841],"block_position":"21-16"},{"bbox":[86,550,492,564],"type":"text","angle":0,"index":19,"text":"注意：尽管我们没有在 models 给表设置主键，但是 Django 会自动添加一个 id 作为主键。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"c729f1ae-e3e3-46ef-a09c-d461f8bc1da8","page_size":[595,841],"block_position":"21-17"},{"bbox":[87,566,132,579],"type":"title","angle":0,"index":20,"text":"# 添加数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":21,"id":"c9774472-21da-4988-ae37-55f8a2956b98","page_size":[595,841],"block_position":"21-18"},{"bbox":[86,582,433,595],"type":"text","angle":0,"index":21,"text":"添加数据需要先创建对象，然后再执行 save 函数，相当于SQL中的INSERT：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":21,"id":"25e55b13-259b-487d-a161-5944ed79de8d","page_size":[595,841],"block_position":"21-19"},{"bbox":[87,597,179,609],"index":22,"angle":0,"type":"code","text":"```txt\n- - coding: utf-8 -\n```","id":"0ff1a76a-a714-4274-afbc-8228035b4614","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-20"},{"bbox":[87,629,255,641],"index":23,"angle":0,"type":"code","text":"```python\nfrom django.http import HttpResponse\n```","id":"1c458eb7-c567-4696-8d43-8a08b9a30ab8","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-21"},{"bbox":[87,661,242,672],"index":24,"angle":0,"type":"code","text":"```python\nfrom TestModel.models import Test\n```","id":"e01f7472-d1dd-48cc-9d0e-daf858aa0437","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-22"},{"bbox":[87,692,150,704],"type":"title","angle":0,"index":25,"text":"# # 数据库操作","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":21,"id":"1c295abe-d9c2-4bc2-9c81-1a83a886018c","page_size":[595,841],"block_position":"21-23"},{"bbox":[87,708,174,719],"index":26,"angle":0,"type":"code","text":"```txt\ndef testdb(request):\n```","id":"4ec9da9e-58c7-4ffc-ae80-5db786e02395","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-24"},{"bbox":[96,723,218,735],"index":27,"angle":0,"type":"code","text":"```txt\ntest1 = Test(name='runoob')\n```","id":"a174cdc2-145d-46c2-8821-f733e667313e","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-25"},{"bbox":[97,738,148,750],"index":28,"angle":0,"type":"code","text":"```txt\ntest1.save()\n```","id":"6b3cab35-29ec-421a-a3ab-7c2a18de3940","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":21,"page_size":[595,841],"block_position":"21-26"}],[{"bbox":[98,79,312,92],"type":"text","angle":0,"index":0,"text":"return HttpResponse(\"<p>数据添加成功！</p>\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"923ff553-89dd-4990-bd46-c2703f0a9197","page_size":[595,841],"block_position":"22-0"},{"bbox":[89,95,132,107],"type":"title","angle":0,"index":1,"text":"# 更新数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":22,"id":"267f49f9-f8dd-4351-b17d-353f38e30ad0","page_size":[595,841],"block_position":"22-1"},{"bbox":[88,110,255,122],"type":"text","angle":0,"index":2,"text":"修改数据可以使用 save() 或 update():","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"5c7fbad4-f212-45d4-a49c-399d02b7b465","page_size":[595,841],"block_position":"22-2"},{"bbox":[88,126,179,137],"index":3,"angle":0,"type":"code","text":"```txt\n- -coding: utf-8 -\n```","id":"202d08a0-1d89-4aff-9b8e-f6348820f7fa","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-3"},{"bbox":[88,157,255,169],"index":4,"angle":0,"type":"code","text":"```python\nfrom django.http import HttpResponse\n```","id":"6c313678-426a-4f37-8bbf-7ea2ad8e193d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-4"},{"bbox":[88,188,242,200],"index":5,"angle":0,"type":"code","text":"```python\nfrom TestModel.models import Test\n```","id":"d2bd58c9-8076-49a3-a2e6-886574b02f3d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-5"},{"bbox":[88,219,150,232],"index":6,"angle":0,"type":"code_caption","text":"# 数据库操作","id":"6f448255-328b-4e7e-9812-8698494345c9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-6"},{"bbox":[88,235,174,247],"index":7,"angle":0,"type":"code","text":"```txt\ndef testdb(request):\n```","id":"daf5b15f-cb74-4329-8a13-302de039c129","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-7"},{"bbox":[97,250,414,263],"type":"text","angle":0,"index":8,"text":"# 修改其中一个 $\\mathrm { i } { \\mathsf { d } } { = } 1$ 的 name 字段，再 save，相当于 SQL 中的 UPDATE","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"948ac4d8-3366-467a-994c-12b9eec369b4","page_size":[595,841],"block_position":"22-8"},{"bbox":[97,266,221,278],"index":9,"angle":0,"type":"code","text":"```python\ntest1 = Test.objects.get(id=1)\n```","id":"1dad2d6e-ccf3-4a67-a5a8-90bb19db1b46","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-9"},{"bbox":[98,282,192,293],"index":10,"angle":0,"type":"code","text":"```python\ntest1.name = 'Google'\n```","id":"9ed66362-175b-4e36-87d7-ef727cd8b684","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-10"},{"bbox":[98,298,148,309],"index":11,"angle":0,"type":"code","text":"```txt\ntest1.save()\n```","id":"22afa35f-c264-4596-80c8-b913bf02beb1","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-11"},{"bbox":[98,328,170,341],"index":12,"angle":0,"type":"code","text":"```txt\n# 另外一种方式\n```","id":"07571bbe-536e-49e6-9b4f-fb0285d047ca","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-12"},{"bbox":[98,343,305,356],"index":13,"angle":0,"type":"code","text":"```python\nTest.objects.filter(id=1).update(name='Google')\n```","id":"516a5ea1-2a54-4c1f-aaa9-0a7424d22fac","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-13"},{"bbox":[98,375,170,387],"index":14,"angle":0,"type":"code","text":"```txt\n修改所有的列\n```","id":"1e5eda3e-0202-47f6-904e-e9603078ee7b","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-14"},{"bbox":[98,391,279,403],"index":15,"angle":0,"type":"code","text":"```txt\nTest.objects.all().update(name='Google')\n```","id":"f0032c28-2e2c-4ccf-b87f-ad91fa6c5b9d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-15"},{"bbox":[98,422,280,435],"index":16,"angle":0,"type":"code","text":"```lua\nreturn HttpResponse(\"/<p>修改成功</p>\")\n```","id":"d16f7439-7244-40e7-bd09-b39f5ff78442","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-16"},{"bbox":[88,438,132,449],"type":"title","angle":0,"index":17,"text":"# 删除数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":22,"id":"61acf607-bbaf-4108-9805-7d4625147deb","page_size":[595,841],"block_position":"22-17"},{"bbox":[88,453,350,465],"type":"text","angle":0,"index":18,"text":"删除数据库中的对象只需调用该对象的delete()方法即可：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"23ae1c6e-70d0-4e8f-8978-e3e9d2a8ae07","page_size":[595,841],"block_position":"22-18"},{"bbox":[88,495,214,521],"type":"title","angle":0,"index":19,"text":"# Django 表单","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":22,"id":"b46179b5-2ae4-4815-8d38-1984c6607af2","page_size":[595,841],"block_position":"22-19"},{"bbox":[87,537,434,549],"type":"text","angle":0,"index":20,"text":"HTML表单是网站交互性的经典方式。 本章将介绍如何用Django对用户提交的表单数据进行处理。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"5622398f-b149-4180-825a-fd48a6d222cc","page_size":[595,841],"block_position":"22-20"},{"bbox":[88,558,180,578],"type":"title","angle":0,"index":21,"text":"# HTTP 请求","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":22,"id":"20d97886-eab5-49ca-ab91-46d7f0de228b","page_size":[595,841],"block_position":"22-21"},{"bbox":[87,587,502,613],"type":"text","angle":0,"index":22,"text":"HTTP协议以\"请求－回复\"的方式工作。客户发送请求时，可以在请求中附加数据。服务器通过解析请求，就可以获得客户传来的数据，并根据URL来提供特定的服务。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"937e0077-4f54-4a8e-a20b-d51cdd20aec7","page_size":[595,841],"block_position":"22-22"},{"bbox":[88,628,153,644],"type":"title","angle":0,"index":23,"text":"# GET 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":22,"id":"c7e8efbb-c561-4716-a47b-9762cb710146","page_size":[595,841],"block_position":"22-23"},{"bbox":[88,657,279,670],"type":"text","angle":0,"index":24,"text":"用户提交了表单，服务器解析表单并回复","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"46aa1fc5-187c-4466-be24-0026385cf60c","page_size":[595,841],"block_position":"22-24"},{"bbox":[87,674,332,685],"type":"text","angle":0,"index":25,"text":"我们在之前的项目中创建一个 search.py 文件，用于接收用户的请求：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":22,"id":"d873092b-cf3a-4822-bb94-aa9bac98ee86","page_size":[595,841],"block_position":"22-25"},{"bbox":[88,692,225,703],"index":26,"angle":0,"type":"code","text":"```python\nfrom django.http import HttpResponse\n```","id":"9c06f6cb-9afc-4b2b-a72a-fce0d385b4bc","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-26"},{"bbox":[88,711,217,720],"index":27,"angle":0,"type":"code","text":"```python\nfrom django.shortcuts import render\n```","id":"d0eff065-9db5-43d0-833b-78fbe5ff4a1c","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-27"},{"bbox":[88,729,113,737],"index":28,"angle":0,"type":"code","text":"```txt\n#表单\n```","id":"e486db42-a6e0-4b4c-922c-a370cb697a53","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-28"},{"bbox":[88,746,181,756],"index":29,"angle":0,"type":"code","text":"```txt\ndef search_form(request):\n```","id":"2934b5e5-9109-4473-b8f5-3a9a0f03a417","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":22,"page_size":[595,841],"block_position":"22-29"}],[{"bbox":[88,77,279,722],"index":0,"angle":0,"type":"code","text":"```python\nreturn render(request, 'search_form.html')  \n#接收请求数据  \ndef search(request):  \n    request_encoding='utf-8'  \n    if 'q' in request.GET and request.GET['q']:  \n        message = '你搜索的内容为: ' + request.GET['q']  \n    else:  \n        message = '你提交了空表单'  \n    return HttpResponse(message)  \n在模板目录templates中添加search_form.html表单：  \n/HelloWorld/template/search_form.html文件代码：  \n<!DOCTYPE html>  \n<html>  \n<head>  \n<meta charset=\"utf-8\">  \n<title>菜鸟教程(runob.com)</title>  \n</head>  \n<body>  \n<form action=\"/search/\" method=\"get\">  \n    <input type=\"text\" name=\"q\">  \n    <input type=\"submit\" value=\"搜索\">  \n</form>  \n</body>  \n</html>  \nurls.py规则修改为如下形式：  \n/HelloWorld/HelloWorld URLs.py文件代码：  \nfrom django.conf.urls import url  \nfrom . import views,testdb,search  \nurlpatterns = [url(r'^hello/$', views.runoob),url(r'^testdb/$', testdb.testdb),url(r'^search-form/$', search.search_form),url(r'^search/$', search.search),]\n```","id":"a2658af8-3705-431f-9fa6-328ceb7c5e21","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":23,"page_size":[595,841],"block_position":"23-0"},{"bbox":[88,735,157,752],"type":"title","angle":0,"index":1,"text":"# POST 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":23,"id":"57788fac-91e9-4581-af6e-c5e7eae7240a","page_size":[595,841],"block_position":"23-1"}],[{"bbox":[87,80,299,89],"type":"text","angle":0,"index":0,"text":"上面我们使用了GET 方法，视图显示和请求处理分成两个函数处理。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"76d2ca4e-c860-4eec-9c1a-ff6256c96195","page_size":[595,841],"block_position":"24-0"},{"bbox":[86,95,426,105],"type":"text","angle":0,"index":1,"text":"提交数据时更常用POST 方法。我们下面使用该方法，并用一个URL和处理函数，同时显示视图和处理请求。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"ab2467ee-0586-46f4-b763-db772fdd21da","page_size":[595,841],"block_position":"24-1"},{"bbox":[88,111,184,121],"type":"title","angle":0,"index":2,"text":"# 1. GET 方法实现（search.py）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"86c1cf2a-d747-4cd8-99e0-49e852abc29e","page_size":[595,841],"block_position":"24-2"},{"bbox":[88,127,113,137],"type":"text","angle":0,"index":3,"text":"python","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"99d1e469-2d92-4838-9054-8a2fa0dbcea7","page_size":[595,841],"block_position":"24-3"},{"bbox":[87,142,245,153],"type":"text","angle":0,"index":4,"text":"# 两个独立的函数： 一个显示表单， 一个处理请求","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"92eba12c-9236-4c3b-96ab-a1300048ea5e","page_size":[595,841],"block_position":"24-4"},{"bbox":[88,158,214,168],"type":"text","angle":0,"index":5,"text":"def search_form(request): # 显示表单","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"a4b698a6-7e48-4540-8ae6-e6dcb9e509ba","page_size":[595,841],"block_position":"24-5"},{"bbox":[95,174,236,184],"type":"text","angle":0,"index":6,"text":"return render(request, 'search_form.html')","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"466e9bcb-6363-49e4-89c5-8cfef6cd4e08","page_size":[595,841],"block_position":"24-6"},{"bbox":[88,205,195,215],"type":"text","angle":0,"index":7,"text":"def search(request): # 处理请求","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"bcc12aac-90a3-4cba-8ddf-ed119a6fee74","page_size":[595,841],"block_position":"24-7"},{"bbox":[95,220,229,230],"type":"text","angle":0,"index":8,"text":"if 'q' in request.GET and request.GET['q']:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"755ea180-0c55-4fb0-aeef-02a04b13122c","page_size":[595,841],"block_position":"24-8"},{"bbox":[102,236,257,246],"type":"text","angle":0,"index":9,"text":"message $=$ '你搜索的内容为: ' $^ +$ request.GET['q']","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"d78b6df2-d4a5-4c63-8480-4cce3e7ffc42","page_size":[595,841],"block_position":"24-9"},{"bbox":[95,252,113,260],"type":"text","angle":0,"index":10,"text":"else:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"f3be9eb5-241f-44da-b463-6346d63fae32","page_size":[595,841],"block_position":"24-10"},{"bbox":[102,267,193,276],"type":"text","angle":0,"index":11,"text":"message $=$ '你提交了空表单'","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"a1158bd9-1bed-4818-b295-a5942dbd136e","page_size":[595,841],"block_position":"24-11"},{"bbox":[95,283,200,292],"type":"text","angle":0,"index":12,"text":"return HttpResponse(message)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"c69aa0e3-3baa-4fc7-bce3-7dd6ff3dd059","page_size":[595,841],"block_position":"24-12"},{"bbox":[88,299,192,309],"type":"title","angle":0,"index":13,"text":"# 2. POST 方法实现（search2.py）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"4ecf49d9-68f2-4e1e-82b4-5c5ef1de30da","page_size":[595,841],"block_position":"24-13"},{"bbox":[88,314,113,323],"type":"text","angle":0,"index":14,"text":"python","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"65ec853f-7fe7-4582-8502-07e80dd6d367","page_size":[595,841],"block_position":"24-14"},{"bbox":[88,329,217,338],"type":"text","angle":0,"index":15,"text":"# 单个函数同时处理表单显示和请求处理","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"67ebdc7a-9cd6-43e4-aeda-a22e4c6f266c","page_size":[595,841],"block_position":"24-15"},{"bbox":[88,345,173,354],"type":"text","angle":0,"index":16,"text":"def search_post(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"714d5b1b-2787-485f-ae6f-8b19e7818a36","page_size":[595,841],"block_position":"24-16"},{"bbox":[95,361,120,370],"type":"text","angle":0,"index":17,"text":"$\\mathsf { c t x } = \\left\\{ \\right\\}$","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"0d2f9028-17e0-47e8-b14b-64e048a4b495","page_size":[595,841],"block_position":"24-17"},{"bbox":[95,376,252,386],"type":"text","angle":0,"index":18,"text":"if request.POST: # 如果是POST 请求 （表单提交）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"d6b6ec8f-4d5c-4053-a967-36be4f6b08ec","page_size":[595,841],"block_position":"24-18"},{"bbox":[102,392,192,401],"type":"text","angle":0,"index":19,"text":"ctx['rlt'] $=$ request.POST['q']","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"0389964c-09c6-4078-a054-6a2ac68ef6bd","page_size":[595,841],"block_position":"24-19"},{"bbox":[95,407,279,417],"type":"text","angle":0,"index":20,"text":"return render(request, \"post.html\", ctx) # 总是返回模板","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"a3870176-4944-44a6-bb4e-dd26fbab1a2a","page_size":[595,841],"block_position":"24-20"},{"bbox":[88,423,177,433],"type":"title","angle":0,"index":21,"text":"# 何时用 GET？何时用 POST？","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"ce8b702f-f216-4d69-b322-91529373ce1b","page_size":[595,841],"block_position":"24-21"},{"bbox":[88,439,145,448],"type":"title","angle":0,"index":22,"text":"# 适合 GET 的情况：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"e1faa746-4095-4fc5-b86d-d867c8b6b16c","page_size":[595,841],"block_position":"24-22"},{"bbox":[105,454,276,464],"type":"text","angle":0,"index":23,"text":"搜索功能（用户可能想收藏或分享搜索结果URL）","id":"da014ba1-ed4c-4bce-84e1-52b004f95826","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-23"},{"bbox":[105,470,242,479],"type":"text","angle":0,"index":24,"text":". 筛选和排序（参数在URL中便于分享）","id":"01df97b0-1735-4bda-9242-293a018d43e7","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-24"},{"bbox":[105,486,240,495],"type":"text","angle":0,"index":25,"text":"幂等操作（不改变服务器状态的操作）","id":"2b806458-5358-4b85-83b0-9474dce9dd65","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-25"},{"bbox":[88,501,149,510],"type":"title","angle":0,"index":27,"text":"# 适合 POST 的情况：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"8ca9d647-9f41-4779-851a-8a1f8d10710a","page_size":[595,841],"block_position":"24-26"},{"bbox":[105,517,208,526],"type":"text","angle":0,"index":28,"text":"登录/注册（包含敏感信息）","id":"c569acee-f3a3-4641-ad99-badb0ed9d5ea","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-27"},{"bbox":[105,532,198,541],"type":"text","angle":0,"index":29,"text":". 表单提交（创建新数据）","id":"aad35ecf-b64c-4328-8485-32ade6075d1b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-28"},{"bbox":[105,548,217,557],"type":"text","angle":0,"index":30,"text":". 任何会改变服务器状态的操作","id":"65da65fe-4a4e-47ce-9d88-115703ef0f28","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-29"},{"bbox":[105,563,168,572],"type":"text","angle":0,"index":31,"text":". 大量数据提交","id":"27484091-f915-4aea-8aac-5bfb788ada76","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-30"},{"bbox":[88,579,132,588],"type":"title","angle":0,"index":33,"text":"# 最佳实践总结","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"44209fa2-0a76-4424-aa0d-ae7e1283cf45","page_size":[595,841],"block_position":"24-31"},{"bbox":[105,594,260,603],"type":"text","angle":0,"index":34,"text":"1. GET 完全可以用单函数处理显示和处理逻辑","id":"4955c7ee-2922-4935-a8e6-381bfd9332c9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-32"},{"bbox":[105,610,313,620],"type":"text","angle":0,"index":35,"text":"2. 原代码设计是过时的模式，现代 Django 开发不推荐这样分离","id":"b718de45-7e29-49f8-a6c7-7d7c4912d0e8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-33"},{"bbox":[105,625,297,635],"type":"text","angle":0,"index":36,"text":"3. 选择GET 还是 POST 取决于具体场景，而不是技术限制","id":"e0b0548d-cae4-4228-b665-a0bcd14c58b2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-34"},{"bbox":[105,641,217,650],"type":"text","angle":0,"index":37,"text":"4. 单函数模式更简洁、更易维护","id":"b17d1084-8bdd-4edc-8cd8-b466b6c4f602","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"page_size":[595,841],"block_position":"24-35"},{"bbox":[88,680,175,697],"type":"title","angle":0,"index":39,"text":"# Request 对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":24,"id":"646e57df-48b0-4770-9fe7-1a1ed084dc02","page_size":[595,841],"block_position":"24-36"},{"bbox":[87,708,345,719],"type":"text","angle":0,"index":40,"text":"每个视图函数的第一个参数是一个HttpRequest 对象，就像下面这个runoob() 函数:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"188b3959-7b0d-48c5-bacc-d581ec9eb131","page_size":[595,841],"block_position":"24-37"},{"bbox":[88,724,208,734],"type":"text","angle":0,"index":41,"text":"from django.http import HttpResponse","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":24,"id":"7a9d8785-55e9-464f-bd11-e971fcefa73f","page_size":[595,841],"block_position":"24-38"}],[{"bbox":[88,86,188,103],"type":"title","angle":0,"index":0,"text":"# QueryDict 对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":25,"id":"cdaa41a5-7bde-4434-8138-0e11aa51c3ee","page_size":[595,841],"block_position":"25-0"},{"bbox":[86,114,330,155],"type":"text","angle":0,"index":1,"text":"在 HttpRequest 对象中, GET 和 POST 属性是 django.http.QueryDict 类的实例。QueryDict类似字典的自定义类，用来处理单键对应多值的情况。QueryDict实现所有标准的词典方法。还包括一些特有的方法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"b8f286a6-0a58-42bc-bcfd-110e10625ac4","page_size":[595,841],"block_position":"25-1"},{"bbox":[87,176,207,201],"index":2,"angle":0,"type":"code","text":"```python\ndef runoob(request): return HttpResponse(\"Hello world\")\n```","id":"3333d976-18ea-42fa-8306-0a4d49c83b7d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":25,"page_size":[595,841],"block_position":"25-2"},{"bbox":[88,218,230,247],"type":"title","angle":0,"index":3,"text":"# Django 视图","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":25,"id":"9edde796-4c9b-460e-b41e-e0758f949b75","page_size":[595,841],"block_position":"25-3"},{"bbox":[88,263,143,282],"type":"title","angle":0,"index":4,"text":"# 视图层","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":25,"id":"90a22397-bd47-435e-b747-01e186c8e5a3","page_size":[595,841],"block_position":"25-4"},{"bbox":[87,292,378,302],"type":"text","angle":0,"index":5,"text":"一个视图函数，简称视图，是一个简单的Python 函数，它接受Web 请求并且返回Web 响应。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"33f81650-0dad-4c32-a65a-793b828cf8c6","page_size":[595,841],"block_position":"25-5"},{"bbox":[87,308,373,317],"type":"text","angle":0,"index":6,"text":"响应可以是一个HTML 页面、一个404 错误页面、重定向页面、XML 文档、或者一张图片...","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"c6e6142f-12f5-4777-a1f4-39b518e64c7a","page_size":[595,841],"block_position":"25-6"},{"bbox":[87,323,483,333],"type":"text","angle":0,"index":7,"text":"无论视图本身包含什么逻辑，都要返回响应。代码写在哪里都可以，只要在Python 目录下面，一般放在项目的views.py 文件中。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"50a0d729-0739-4ce2-82fb-c04d75519c12","page_size":[595,841],"block_position":"25-7"},{"bbox":[87,339,323,349],"type":"text","angle":0,"index":8,"text":"每个视图函数都负责返回一个HttpResponse 对象，对象中包含生成的响应。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"12364d18-9655-49ad-86d0-af3118bfa7a7","page_size":[595,841],"block_position":"25-8"},{"bbox":[87,354,324,364],"type":"text","angle":0,"index":9,"text":"视图层中有两个重要的对象：请求对象(request)与响应对象(HttpResponse)。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"5c193073-4f24-40b5-b5d1-3400fb0fac92","page_size":[595,841],"block_position":"25-9"},{"bbox":[87,370,246,380],"type":"text","angle":0,"index":10,"text":"请求对象: HttpRequest 对象（简称 request 对象）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"2f4e37d7-a425-407f-a23e-ef3a2ec9cc06","page_size":[595,841],"block_position":"25-10"},{"bbox":[87,386,196,396],"type":"text","angle":0,"index":11,"text":"以下介绍几个常用的request 属性。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"c664965a-dee9-403e-8aa1-096ab89667f4","page_size":[595,841],"block_position":"25-11"},{"bbox":[88,411,136,424],"type":"title","angle":0,"index":12,"text":"# 1、GET","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":25,"id":"956b115f-9e28-403c-ad57-94d35a6175b3","page_size":[595,841],"block_position":"25-12"},{"bbox":[87,438,331,447],"type":"text","angle":0,"index":13,"text":"数据类型是QueryDict，一个类似于字典的对象，包含HTTP GET 的所有参数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"7ca9d239-1230-43e2-9a0f-3fb0a0230181","page_size":[595,841],"block_position":"25-13"},{"bbox":[87,454,233,462],"type":"text","angle":0,"index":14,"text":"有相同的键，就把所有的值放到对应的列表里。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"51dd1742-9b7b-4767-aebb-43b0b29eb00d","page_size":[595,841],"block_position":"25-14"},{"bbox":[87,469,158,478],"type":"text","angle":0,"index":15,"text":"取值格式：对象.方法。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"414e492c-384e-4061-8033-43f42202d2ac","page_size":[595,841],"block_position":"25-15"},{"bbox":[87,485,303,494],"type":"text","angle":0,"index":16,"text":"get()：返回字符串，如果该键对应有多个值，取出该键的最后一个值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"a8686e9c-8047-4434-a94b-324c112f9d13","page_size":[595,841],"block_position":"25-16"},{"bbox":[88,501,104,509],"type":"text","angle":0,"index":17,"text":"实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"201b0efe-d572-4ef8-81cb-b779a4d9e4db","page_size":[595,841],"block_position":"25-17"},{"bbox":[87,516,241,557],"index":18,"angle":0,"type":"code","text":"```python\ndef runoob(request):\n    name = request.GET.get(\"name\")\n    return HttpResponse('姓名：{}''.format(name))\n```","id":"385dfda1-8a87-4d73-88ac-697ae3692582","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":25,"page_size":[595,841],"block_position":"25-18"},{"bbox":[87,571,146,585],"type":"title","angle":0,"index":19,"text":"# 2、POST","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":25,"id":"2a7523c4-3570-4a23-8ae9-c5109b780a5b","page_size":[595,841],"block_position":"25-19"},{"bbox":[87,598,335,608],"type":"text","angle":0,"index":20,"text":"数据类型是QueryDict，一个类似于字典的对象，包含HTTP POST 的所有参数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"4cc51fae-a3f1-4516-adee-15c72591a07c","page_size":[595,841],"block_position":"25-20"},{"bbox":[87,614,368,624],"type":"text","angle":0,"index":21,"text":"常用于form 表单，form 表单里的标签name 属性对应参数的键，value 属性对应参数的值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"eac0be39-7457-4b8f-9998-be6446fd9c64","page_size":[595,841],"block_position":"25-21"},{"bbox":[87,629,159,639],"type":"text","angle":0,"index":22,"text":"取值格式：对象.方法。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"57b63f20-e705-473d-899d-a87a370388c6","page_size":[595,841],"block_position":"25-22"},{"bbox":[87,645,303,655],"type":"text","angle":0,"index":23,"text":"get()：返回字符串，如果该键对应有多个值，取出该键的最后一个值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"5e1ee7d2-ba07-4ddb-88e7-f1a9346aa673","page_size":[595,841],"block_position":"25-23"},{"bbox":[88,661,104,670],"type":"text","angle":0,"index":24,"text":"实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":25,"id":"2a47a6ff-1fe1-4c41-9f8c-e38844727b1f","page_size":[595,841],"block_position":"25-24"},{"bbox":[87,677,241,718],"index":25,"angle":0,"type":"code","text":"```python\ndef runoob(request):\n    name = request.POST.get(\"name\")\n    return HttpResponse('姓名：{}'.format(name))\n```","id":"c35160e1-f4f0-4360-880a-783226054fab","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":25,"page_size":[595,841],"block_position":"25-25"},{"bbox":[87,732,145,748],"type":"title","angle":0,"index":26,"text":"# 3、body","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":25,"id":"114f3b57-9f07-487e-abf1-8ea33b9dca4c","page_size":[595,841],"block_position":"25-26"}],[{"bbox":[86,80,411,90],"type":"text","angle":0,"index":0,"text":"数据类型是二进制字节流，是原生请求体里的参数内容，在HTTP 中用于POST，因为GET 没有请求体。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"71d4ed96-bccb-4030-aa3e-cea1b7020e38","page_size":[595,841],"block_position":"26-0"},{"bbox":[86,95,399,105],"type":"text","angle":0,"index":1,"text":"在HTTP 中不常用，而在处理非HTTP 形式的报文时非常有用，例如：二进制图片、XML、Json 等。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"fa395dbe-c4ab-4973-afeb-1df8bfc71d7b","page_size":[595,841],"block_position":"26-1"},{"bbox":[88,111,105,121],"type":"title","angle":0,"index":2,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"6968aa13-6002-4780-8634-6f6e323cd573","page_size":[595,841],"block_position":"26-2"},{"bbox":[88,127,202,185],"index":3,"angle":0,"type":"algorithm","text":"def runoob(request): name  $=$  request.body print(name) return HttpResponse(\"菜鸟教程\")","id":"ccaac63f-7562-448c-b2d5-c8ed52929681","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"page_size":[595,841],"block_position":"26-3"},{"bbox":[87,189,229,199],"type":"text","angle":0,"index":4,"text":"获取URL 中的路径部分，数据类型是字符串。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"0a1e8b42-4787-4749-ab45-5736c318364d","page_size":[595,841],"block_position":"26-4"},{"bbox":[88,205,105,215],"type":"title","angle":0,"index":5,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"5d72520c-10b1-4fb8-852c-c6a676c543fe","page_size":[595,841],"block_position":"26-5"},{"bbox":[88,221,200,278],"index":6,"angle":0,"type":"algorithm","text":"def runoob(request): name  $=$  request.path print(name) return HttpResponse(\"菜鸟教程\")","id":"23eea685-2426-460d-b8b0-a1fec9da5fef","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"page_size":[595,841],"block_position":"26-6"},{"bbox":[87,291,143,307],"type":"title","angle":0,"index":7,"text":"# 4、path","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"da651323-4a9d-46de-85cf-faacdcb84405","page_size":[595,841],"block_position":"26-7"},{"bbox":[87,319,229,329],"type":"text","angle":0,"index":8,"text":"获取URL 中的路径部分，数据类型是字符串。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"c8be5afc-31ee-4d5a-9c2a-47d71e87c98c","page_size":[595,841],"block_position":"26-8"},{"bbox":[88,334,105,344],"type":"title","angle":0,"index":9,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"1106c2a8-46e3-46b0-9bb0-36945001b541","page_size":[595,841],"block_position":"26-9"},{"bbox":[88,349,201,407],"index":10,"angle":0,"type":"algorithm","text":"def runoob(request): name  $=$  request.path print(name) return HttpResponse(\"菜鸟教程\")","id":"9e0406d7-f67d-4919-b919-5a9f8326361a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"page_size":[595,841],"block_position":"26-10"},{"bbox":[87,437,166,451],"type":"title","angle":0,"index":11,"text":"# 5、method","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"50c3de22-d96d-4f8c-a0a9-c1ec658906ec","page_size":[595,841],"block_position":"26-11"},{"bbox":[87,464,268,474],"type":"text","angle":0,"index":12,"text":"获取当前请求的方式，数据类型是字符串，且结果为大写。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"131691a8-c9ce-4496-91bd-1a3d229ca6f3","page_size":[595,841],"block_position":"26-12"},{"bbox":[88,480,105,489],"type":"title","angle":0,"index":13,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"b25f3967-2e46-4202-bb0b-32088335f250","page_size":[595,841],"block_position":"26-13"},{"bbox":[88,495,202,552],"index":14,"angle":0,"type":"algorithm","text":"def runoob(request): name  $=$  request.method print(name) return HttpResponse(\"菜鸟教程\")","id":"41dbcdb8-dff2-412c-aa1d-eefcf1a2587a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"page_size":[595,841],"block_position":"26-14"},{"bbox":[87,564,348,586],"type":"title","angle":0,"index":15,"text":"# 响应对象：HttpResponse 对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"9a32dca0-db49-48f6-9613-f7ffbe840a33","page_size":[595,841],"block_position":"26-15"},{"bbox":[87,593,293,604],"type":"text","angle":0,"index":16,"text":"响应对象主要有三种形式：HttpResponse()、render()、redirect()。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"065cb965-32ff-4428-b962-5bdf4a3235da","page_size":[595,841],"block_position":"26-16"},{"bbox":[86,609,452,619],"type":"text","angle":0,"index":17,"text":"HttpResponse(): 返回文本，参数为字符串，字符串中写文本内容。如果参数为字符串里含有html 标签，也可以渲染。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"c92d72d8-7dfa-40c2-bebc-f36d63df1a9e","page_size":[595,841],"block_position":"26-17"},{"bbox":[86,624,500,634],"type":"text","angle":0,"index":18,"text":"ender(): 返回文本，第一个参数为 request，第二个参数为字符串（页面名称），第三个参数为字典（可选参数，向页面传递的参数：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"76bd383c-27af-432e-90bf-99ff6b66d506","page_size":[595,841],"block_position":"26-18"},{"bbox":[87,640,211,650],"type":"text","angle":0,"index":19,"text":"键为页面参数名，值为views参数名）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"82c0d244-cd98-4626-ab54-cad457b8a6c9","page_size":[595,841],"block_position":"26-19"},{"bbox":[88,655,105,666],"type":"title","angle":0,"index":20,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"afe5e33a-d879-4a0c-8ea7-754f6be3c4ac","page_size":[595,841],"block_position":"26-20"},{"bbox":[88,671,261,713],"index":21,"angle":0,"type":"code","text":"```python\ndef runoob(request):\n    name = \"菜鸟教程\"\n    return render(request, \"runoob.html\", {\"name\": name})\n```","id":"efe3f42a-a9b2-47c5-b2a9-987d7eea1c35","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":26,"page_size":[595,841],"block_position":"26-21"},{"bbox":[87,719,456,729],"type":"text","angle":0,"index":22,"text":"redirect()：重定向，跳转新页面。参数为字符串，字符串中填写页面路径。一般用于form 表单提交后，跳转到新页面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":26,"id":"157e25c0-c296-444e-b2d8-31555e4aabd2","page_size":[595,841],"block_position":"26-22"},{"bbox":[88,734,105,744],"type":"title","angle":0,"index":23,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":26,"id":"eb7e894a-38d9-49e5-b8b4-8c57442f45de","page_size":[595,841],"block_position":"26-23"},{"bbox":[88,750,155,760],"index":24,"angle":0,"type":"code","text":"```txt\ndef runoob(request):\n```","id":"2cbdd880-caf1-4655-bc9f-e08d43f815eb","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":26,"page_size":[595,841],"block_position":"26-24"}],[{"bbox":[95,81,173,89],"type":"text","angle":0,"index":0,"text":"return redirect(\"/index/\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"5179f807-91da-4255-96c5-d9347649676c","page_size":[595,841],"block_position":"27-0"},{"bbox":[87,95,274,105],"type":"text","angle":0,"index":1,"text":"render 和 redirect 是在 HttpResponse 的基础上进行了封装：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"f0def680-1813-49fc-83db-b7e9a9b0e10f","page_size":[595,841],"block_position":"27-1"},{"bbox":[105,111,264,121],"type":"text","angle":0,"index":2,"text":"render：底层返回的也是 HttpResponse 对象","id":"3b76c390-4349-484e-8c8b-025cec4853ea","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-2"},{"bbox":[105,127,260,137],"type":"text","angle":0,"index":3,"text":"redirect：底层继承的是 HttpResponse 对象","id":"0655d774-dbdb-40be-b3d2-4c5c4431f57d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-3"},{"bbox":[89,154,229,183],"type":"title","angle":0,"index":5,"text":"# Django 路由","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":27,"id":"16ffe373-8898-4c90-8f8c-31dfb9efe93a","page_size":[595,841],"block_position":"27-4"},{"bbox":[86,194,503,205],"type":"text","angle":0,"index":6,"text":"路由简单的来说就是根据用户请求的URL 链接来判断对应的处理程序，并返回处理结果，也就是URL 与Django 的视图建立映射关系。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"76b11a53-4813-4807-a2c5-2354e9cadf55","page_size":[595,841],"block_position":"27-5"},{"bbox":[87,210,318,220],"type":"text","angle":0,"index":7,"text":"Django 路由在 urls.py 配置，urls.py 中的每一条配置对应相应的处理方法。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"860c0e83-dfd7-44fc-981f-28918c862d54","page_size":[595,841],"block_position":"27-6"},{"bbox":[88,232,171,251],"type":"title","angle":0,"index":8,"text":"# Path 设置","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":27,"id":"9753e10c-3b48-4f00-aef8-4ad005e9322e","page_size":[595,841],"block_position":"27-7"},{"bbox":[87,262,168,271],"type":"title","angle":0,"index":9,"text":"# Django 2.2.x 之后的版本","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":27,"id":"cd915f02-127d-4c8d-8bad-62d4c8c5f8a1","page_size":[595,841],"block_position":"27-8"},{"bbox":[105,277,367,287],"type":"text","angle":0,"index":10,"text":"path：用于普通路径，不需要自己手动添加正则首位限制符号，底层已经添加。","id":"dcdf010f-1e54-4db2-b9b9-979263e7de79","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-9"},{"bbox":[105,292,321,302],"type":"text","angle":0,"index":11,"text":". re_path：用于正则路径，需要自己手动添加正则首位限制符号。","id":"95a2a5b4-f847-4ab7-abd8-f3097209bf25","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-10"},{"bbox":[87,308,104,317],"type":"text","angle":0,"index":13,"text":"实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"3429b424-921e-4d8c-a25d-e637170bb2b6","page_size":[595,841],"block_position":"27-11"},{"bbox":[86,323,277,412],"index":14,"angle":0,"type":"code","text":"```python\nfrom django.url import re_path # 用re_path 需要引入\nurlpatterns = [\n    path('admin/', admin.site URLs),\n    path('index/', views.index), # 普通路径\n    re_path(r'^articles/[0-9]{4}]/$', views_articles), # 正则路径\n```","id":"31698199-b744-4ca8-bdf3-a33f6e59865c","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-12"},{"bbox":[88,423,235,443],"type":"title","angle":0,"index":15,"text":"# 正则路径中的分组","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":27,"id":"cc6c7914-68d1-473f-97e3-ca4d16fb8d64","page_size":[595,841],"block_position":"27-13"},{"bbox":[88,458,225,474],"type":"title","angle":0,"index":16,"text":"# 正则路径中的无名分组","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":27,"id":"20074f51-9177-4e39-bd7c-f3d5c9d2e391","page_size":[595,841],"block_position":"27-14"},{"bbox":[87,486,192,497],"type":"text","angle":0,"index":17,"text":"无名分组按位置传参，一一对应。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"111e6361-9ace-49f2-b9d3-8c746f023e40","page_size":[595,841],"block_position":"27-15"},{"bbox":[87,502,299,513],"type":"text","angle":0,"index":18,"text":"views 中除了request，其他形参的数量要与urls 中的分组数量一致。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"101f804c-4407-44ba-bd86-ba3a11dd80a5","page_size":[595,841],"block_position":"27-16"},{"bbox":[87,518,113,528],"type":"text","angle":0,"index":19,"text":"urls.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"0948949a-c7da-4674-b16c-045a5580975b","page_size":[595,841],"block_position":"27-17"},{"bbox":[87,534,229,622],"index":20,"angle":0,"type":"algorithm","text":"urlpatterns  $=$  [ path('admin'/,admin.site URLs), re_path(\"^index/([0-9]{4})/$\",views.index), ] views.py from django.shortcuts import HttpResponse","id":"4d0df8ec-a085-4e44-b06a-e1cfab6088c9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-18"},{"bbox":[87,643,294,684],"index":21,"angle":0,"type":"code","text":"```python\ndef index(request, year):\n    print(year) # 一个形参代表路径中一个分组的内容，按顺序匹配\n    return HttpResponse('菜鸟教程')\n```","id":"eb7f5570-8295-4778-b847-3b4f8c28977c","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":27,"page_size":[595,841],"block_position":"27-19"},{"bbox":[88,697,226,713],"type":"title","angle":0,"index":22,"text":"# 正则路径中的有名分组","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":27,"id":"3d98bbdc-0ae2-4cac-8c24-9a81e4afaef2","page_size":[595,841],"block_position":"27-20"},{"bbox":[88,725,108,735],"type":"text","angle":0,"index":23,"text":"语法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"14b8990e-3eaf-48ae-a25c-9302e85cbf7c","page_size":[595,841],"block_position":"27-21"},{"bbox":[88,741,161,751],"type":"text","angle":0,"index":24,"text":"(?P<组名>正则表达式)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":27,"id":"574e8ed0-b2fb-4c20-9001-b792ece03ca2","page_size":[595,841],"block_position":"27-22"}],[{"bbox":[86,80,218,89],"type":"text","angle":0,"index":0,"text":"有名分组按关键字传参，与位置顺序无关。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"bb355947-c561-4ac4-9811-6932624b0323","page_size":[595,841],"block_position":"28-0"},{"bbox":[86,95,455,105],"type":"text","angle":0,"index":1,"text":"views 中除了request，其他形参的数量要与urls 中的分组数量一致，并且views 中的形参名称要与urls 中的组名对应。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"262c7b6a-7449-42fa-b97d-499e6994a217","page_size":[595,841],"block_position":"28-1"},{"bbox":[87,111,113,121],"type":"text","angle":0,"index":2,"text":"urls.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"8f5b8dd1-5fee-42ea-be71-ccf33dba2eae","page_size":[595,841],"block_position":"28-2"},{"bbox":[87,127,276,263],"index":3,"angle":0,"type":"algorithm","text":"urlpatterns  $=$  [path('admin／',admin.site.urls),re_path(\"^index/(?P[0-9]{4})/(?P[0-9]{2})/\\$\"，views.index),]views.pyfrom django.shortcuts import HttpResponsedef index(request, year, month):print(year,month)#一个形参代表路径中一个分组的内容,return HttpResponse('菜鸟教程')","id":"65831b74-bce2-415f-ab4e-9b5a6275c8ff","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"page_size":[595,841],"block_position":"28-3"},{"bbox":[87,275,202,291],"type":"title","angle":0,"index":4,"text":"# 路由分发(include)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":28,"id":"28e5dfbb-ed23-4ce0-9d67-04d688bdb99f","page_size":[595,841],"block_position":"28-4"},{"bbox":[86,303,362,313],"type":"text","angle":0,"index":5,"text":"存在问题：Django 项目里多个app目录共用一个urls 容易造成混淆，后期维护也不方便。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"58c9d356-c5c0-4eec-b590-398e3f0351dd","page_size":[595,841],"block_position":"28-5"},{"bbox":[86,319,317,328],"type":"text","angle":0,"index":6,"text":"解决：使用路由分发（include），让每个app目录都单独拥有自己的urls。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"03ac1ee0-4e9f-49ba-80aa-3b48201634bf","page_size":[595,841],"block_position":"28-6"},{"bbox":[87,334,107,343],"type":"text","angle":0,"index":7,"text":"步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"94136a3c-c0c8-455a-a44c-47f6ed7389ba","page_size":[595,841],"block_position":"28-7"},{"bbox":[105,350,270,359],"type":"text","angle":0,"index":8,"text":"1、在每个 app 目录里都创建一个 urls.py 文件。","id":"fd76580d-5bc6-41a2-ae39-8a86bf35a36f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"page_size":[595,841],"block_position":"28-8"},{"bbox":[105,365,344,375],"type":"text","angle":0,"index":9,"text":"2、在项目名称目录下的urls 文件里，统一将路径分发给各个app 目录。","id":"3fa0f19c-13c6-459b-bf5f-d88eea4056bf","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"page_size":[595,841],"block_position":"28-9"},{"bbox":[87,380,104,391],"type":"text","angle":0,"index":11,"text":"实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"932fce0b-618a-42bc-9376-42c8d535f7fe","page_size":[595,841],"block_position":"28-10"},{"bbox":[86,396,196,406],"type":"text","angle":0,"index":12,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"e4aa9c09-daeb-4446-92c4-d70cd34c1141","page_size":[595,841],"block_position":"28-11"},{"bbox":[86,412,295,484],"index":13,"angle":0,"type":"code","text":"```python\nfrom django.url import path, include # 从 django.url 引入 include  \nurlpatterns = [  \n    path('admin/', admin.site URLs),  \n    path(\"app01/\", include(\"app01 URLs\")),  \n    path(\"app02/\", include(\"app02 URLs\")),\n```","id":"1d41a307-87ba-4c54-af54-99451892fd5d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":28,"page_size":[595,841],"block_position":"28-12"},{"bbox":[88,512,162,531],"type":"title","angle":0,"index":14,"text":"# 反向解析","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":28,"id":"8ebd494c-b6e3-45da-b851-38153e67d8e0","page_size":[595,841],"block_position":"28-13"},{"bbox":[86,542,421,551],"type":"text","angle":0,"index":15,"text":"随着功能的增加，路由层的url 发生变化，就需要去更改对应的视图层和模板层的url，非常麻烦，不便维护。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"1f32dcca-5fdf-4ff6-ad60-473f6048846b","page_size":[595,841],"block_position":"28-14"},{"bbox":[86,557,456,566],"type":"text","angle":0,"index":16,"text":"这时我们可以利用反向解析，当路由层url 发生改变，在视图层和模板层动态反向解析出更改后的url，免去修改的操作。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"e7582b6b-ee87-41ec-be0c-eb28239585d9","page_size":[595,841],"block_position":"28-15"},{"bbox":[87,573,254,582],"type":"text","angle":0,"index":17,"text":"反向解析一般用在模板中的超链接及视图中的重定向。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"8f04d39b-1adc-4d6f-9735-eea1d8a332e6","page_size":[595,841],"block_position":"28-16"},{"bbox":[88,597,143,612],"type":"title","angle":0,"index":18,"text":"# 普通路径","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":28,"id":"7e8a7874-8511-49e2-af3b-b38eeea7bf05","page_size":[595,841],"block_position":"28-17"},{"bbox":[86,624,236,634],"type":"text","angle":0,"index":19,"text":"在urls.py 中给路由起别名，name=\"路由别名\"。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"a083ab28-9346-4d24-afd4-dab2954cd1d7","page_size":[595,841],"block_position":"28-18"},{"bbox":[87,640,217,650],"type":"text","angle":0,"index":20,"text":"path(\"login1/\", views.login, name=\"login\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"3198b83d-4cf2-452a-8e8e-548dcceb53c9","page_size":[595,841],"block_position":"28-19"},{"bbox":[87,655,350,666],"type":"text","angle":0,"index":21,"text":"在 views.py 中，从 django.urls 中引入 reverse，利用 reverse(\"路由别名\") 反向解析:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"d71478d9-ba1a-491e-b1a3-07aad527f863","page_size":[595,841],"block_position":"28-20"},{"bbox":[87,671,186,681],"type":"text","angle":0,"index":22,"text":"return redirect(reverse(\"login\"))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"995b6bea-e306-44fd-83dc-754f0d143f0b","page_size":[595,841],"block_position":"28-21"},{"bbox":[86,687,324,697],"type":"text","angle":0,"index":23,"text":"在模板 templates 中的 HTML 文件中，利用 {% url \"路由别名\" %} 反向解析。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"b94eec22-faed-44cf-9053-3f97eaddd6f5","page_size":[595,841],"block_position":"28-22"},{"bbox":[87,703,238,712],"type":"text","angle":0,"index":24,"text":"<form action=\"{% url 'login' %}\" method=\"post\">","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":28,"id":"eb34d7a9-4b54-4326-98fd-6398d212c04e","page_size":[595,841],"block_position":"28-23"},{"bbox":[87,726,217,742],"type":"title","angle":0,"index":25,"text":"# 正则路径（无名分组）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":28,"id":"240cfa84-9ff9-4531-ae50-bbb6baf14c08","page_size":[595,841],"block_position":"28-24"}],[{"bbox":[86,80,238,90],"type":"text","angle":0,"index":0,"text":"在 urls.py 中给路由起别名，name=\"路由别名\"。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"4e63d641-f821-42a1-aeeb-48d0a74141bf","page_size":[595,841],"block_position":"29-0"},{"bbox":[86,95,262,105],"type":"text","angle":0,"index":1,"text":"re_path(r\"^login/([0-9]{2})/$\", views.login, name=\"login\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"04c87187-f477-40b6-ab4c-fdb073dcd8d0","page_size":[595,841],"block_position":"29-1"},{"bbox":[86,111,447,121],"type":"text","angle":0,"index":2,"text":"在 views.py 中，从 django.urls 中引入 reverse，利用 reverse(\"路由别名\"，args=(符合正则匹配的参数,)) 反向解析。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"bc05cad2-707e-4d2f-812e-b515e241f64b","page_size":[595,841],"block_position":"29-2"},{"bbox":[86,127,220,137],"type":"text","angle":0,"index":3,"text":"return redirect(reverse(\"login\",args=(10,)))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"3b12a3e2-dbc6-42d5-997f-8dbc3fa34b1c","page_size":[595,841],"block_position":"29-3"},{"bbox":[86,142,382,153],"type":"text","angle":0,"index":4,"text":"在模板 templates 中的 HTML 文件中利用 {% url \"路由别名\" 符合正则匹配的参数 %} 反向解析。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"2dd9f192-5875-4ca1-8b31-9a9edc6a211a","page_size":[595,841],"block_position":"29-4"},{"bbox":[86,158,248,168],"type":"text","angle":0,"index":5,"text":"<form action=\"{% url 'login' 10 %}\" method=\"post\">","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"2a4b7b19-8f38-4558-b415-f561e07fc062","page_size":[595,841],"block_position":"29-5"},{"bbox":[87,181,218,197],"type":"title","angle":0,"index":6,"text":"# 正则路径（有名分组）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":29,"id":"56f46965-e916-4057-b851-b0f8c6f7fab9","page_size":[595,841],"block_position":"29-6"},{"bbox":[86,210,238,220],"type":"text","angle":0,"index":7,"text":"在 urls.py 中给路由起别名，name=\"路由别名\"。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"af8f3816-c923-4304-a9a9-c2f54de64659","page_size":[595,841],"block_position":"29-7"},{"bbox":[86,225,292,235],"type":"text","angle":0,"index":8,"text":"re_path(r\"^login/(?P<year>[0-9]{4})/$\", views.login, name=\"login\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"494d7f30-444c-48df-a8a7-52035a25f6fa","page_size":[595,841],"block_position":"29-8"},{"bbox":[86,241,484,251],"type":"text","angle":0,"index":9,"text":"在 views.py 中，从 django.urls 中引入 reverse，利用 reverse(\"路由别名\"，kwargs={\"分组名\":符合正则匹配的参数}) 反向解析。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"3b37ebec-b991-4090-a8c5-0231824ecefb","page_size":[595,841],"block_position":"29-9"},{"bbox":[87,256,255,266],"type":"text","angle":0,"index":10,"text":"return redirect(reverse(\"login\",kwargs={\"year\":3333}))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"91c8b073-ead7-4444-8dea-0aec9718ce67","page_size":[595,841],"block_position":"29-10"},{"bbox":[86,272,414,282],"type":"text","angle":0,"index":11,"text":"在模板 templates 中的 HTML 文件中，利用{% url \"路由别名\" 分组名=符合正则匹配的参数 %} 反向解析。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"c932de59-4122-438c-ae11-e1ffb71d33d2","page_size":[595,841],"block_position":"29-11"},{"bbox":[86,288,273,297],"type":"text","angle":0,"index":12,"text":"<form action=\"{% url 'login' year=3333 %}\" method=\"post\">","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"2603b4af-f6ca-4997-961b-d6ad49ecca12","page_size":[595,841],"block_position":"29-12"},{"bbox":[87,325,163,344],"type":"title","angle":0,"index":13,"text":"# 命名空间","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":29,"id":"c8ebdd3a-e72c-4311-9b1f-bd4f01bdf0a4","page_size":[595,841],"block_position":"29-13"},{"bbox":[86,354,271,364],"type":"text","angle":0,"index":14,"text":"命名空间（英语：Namespace）是表示标识符的可见范围。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"c7135345-bfed-48de-b23f-76197305af15","page_size":[595,841],"block_position":"29-14"},{"bbox":[86,370,339,380],"type":"text","angle":0,"index":15,"text":"一个标识符可在多个命名空间中定义，它在不同命名空间中的含义是互不相干的。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"02f1749f-b9af-466e-95d7-44543cd230ac","page_size":[595,841],"block_position":"29-15"},{"bbox":[86,386,464,395],"type":"text","angle":0,"index":16,"text":"一个新的命名空间中可定义任何标识符，它们不会与任何重复的标识符发生冲突，因为重复的定义都处于其它命名空间中。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"42edde47-813e-4c26-8e6e-588f227a8dc5","page_size":[595,841],"block_position":"29-16"},{"bbox":[86,401,505,411],"type":"text","angle":0,"index":17,"text":"存在问题：路由别名 name 没有作用域，Django 在反向解析 URL 时，会在项目全局顺序搜索，当查找到第一个路由别名 name 指定","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"09a53f73-c6ca-4d68-a9db-5a6fe50e64da","page_size":[595,841],"block_position":"29-17"},{"bbox":[86,417,450,427],"type":"text","angle":0,"index":18,"text":"URL 时，立即返回。当在不同的 app 目录下的 urls 中定义相同的路由别名 name 时，可能会导致 URL 反向解析错误。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"cfd481b9-486c-4689-88c5-4c767bf99c41","page_size":[595,841],"block_position":"29-18"},{"bbox":[86,433,156,443],"type":"text","angle":0,"index":19,"text":"解决：使用命名空间。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"bc63ac11-6c6f-42d2-bb26-24ac934e380e","page_size":[595,841],"block_position":"29-19"},{"bbox":[87,449,119,458],"type":"title","angle":0,"index":20,"text":"# 普通路径","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":29,"id":"962db474-23e5-45a9-8d61-cd6d0858ecc1","page_size":[595,841],"block_position":"29-20"},{"bbox":[86,464,250,473],"type":"text","angle":0,"index":21,"text":"定义命名空间（include 里面是一个元组）格式如下：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"d6f2fb09-6a90-4824-84c9-6101f6baef9e","page_size":[595,841],"block_position":"29-21"},{"bbox":[86,480,211,490],"type":"text","angle":0,"index":22,"text":"include((\"app 名称：urls\"，\"app 名称\"))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"1aa0ec54-0020-420d-b441-ea40242f0079","page_size":[595,841],"block_position":"29-22"},{"bbox":[87,495,107,504],"type":"text","angle":0,"index":23,"text":"实例：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"61f20096-1556-4dbd-b8e3-8637eaed915a","page_size":[595,841],"block_position":"29-23"},{"bbox":[86,510,234,520],"type":"text","angle":0,"index":24,"text":"path(\"app01/\", include((\"app01.urls\",\"app01\")))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"f23456b4-7ae9-4606-bc4c-60cf4fcad3ae","page_size":[595,841],"block_position":"29-24"},{"bbox":[86,526,234,536],"type":"text","angle":0,"index":25,"text":"path(\"app02/\", include((\"app02.urls\",\"app02\")))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"434d4b25-4112-4cf6-a3c1-8591249c8c96","page_size":[595,841],"block_position":"29-25"},{"bbox":[86,542,208,551],"type":"text","angle":0,"index":26,"text":"在 app01/urls.py 中起相同的路由别名。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"98ecbfa7-fa64-4988-8fa5-d761c7bed1f8","page_size":[595,841],"block_position":"29-26"},{"bbox":[86,557,213,567],"type":"text","angle":0,"index":27,"text":"path(\"login/\", views.login, name=\"login\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"35a1436f-128c-468f-aa73-cf0b464f3b67","page_size":[595,841],"block_position":"29-27"},{"bbox":[86,573,228,582],"type":"text","angle":0,"index":28,"text":"在views.py 中使用名称空间，语法格式如下：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"72006280-0be1-4b6b-b351-29560d27e591","page_size":[595,841],"block_position":"29-28"},{"bbox":[86,588,185,598],"type":"text","angle":0,"index":29,"text":"reverse(\"app 名称：路由别名\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"0da5c85c-ce05-49d7-b1e7-4ea4df550bbe","page_size":[595,841],"block_position":"29-29"},{"bbox":[87,604,107,613],"type":"text","angle":0,"index":30,"text":"实例：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"55a798e1-ddd2-4331-ab3c-40dd892527ae","page_size":[595,841],"block_position":"29-30"},{"bbox":[86,620,205,629],"type":"text","angle":0,"index":31,"text":"return redirect(reverse(\"app01:login\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"ffbff0c5-a4f7-473f-a40d-d5bc0ac50d61","page_size":[595,841],"block_position":"29-31"},{"bbox":[88,646,363,675],"type":"title","angle":0,"index":32,"text":"# Django Admin 管理工具","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":29,"id":"551e2e8a-65e4-463c-8c16-70c49484cfff","page_size":[595,841],"block_position":"29-32"},{"bbox":[87,692,317,709],"type":"title","angle":0,"index":33,"text":"# Django 提供了基于web 的管理工具。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":29,"id":"ed7c4da7-5b22-46d2-a2dd-025596f5f82b","page_size":[595,841],"block_position":"29-33"},{"bbox":[86,720,433,731],"type":"text","angle":0,"index":34,"text":"Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"7df4179b-d429-4917-aecd-6162e072f4ea","page_size":[595,841],"block_position":"29-34"},{"bbox":[86,736,230,746],"type":"text","angle":0,"index":35,"text":"/HelloWorld/HelloWorld/settings.py 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":29,"id":"4fc65e3f-5131-4274-8550-5c1759425a2a","page_size":[595,841],"block_position":"29-35"}],[{"bbox":[88,80,161,89],"index":0,"angle":0,"type":"code","text":"```txt\nINSTALLED_APPS = (\n```","id":"d4f5e64e-c3e2-4a86-8f1d-21004cfb43ac","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-0"},{"bbox":[96,96,167,105],"index":1,"angle":0,"type":"code","text":"```txt\n'django.contrib_admin',\n```","id":"7ef25243-00d0-4d25-a4e2-084c859b2ca7","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-1"},{"bbox":[96,111,162,121],"index":2,"angle":0,"type":"code","text":"```txt\n'django.contrib.auth',\n```","id":"464b3360-6ae8-4acc-9d9b-312e2dc9b7cb","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-2"},{"bbox":[96,127,188,137],"index":3,"angle":0,"type":"code","text":"```python\n'django.contrib.contenttypes',\n```","id":"b0af1a9a-76ea-4c5a-9b44-4d492c1cb030","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-3"},{"bbox":[96,142,176,152],"index":4,"angle":0,"type":"code","text":"```javascript\n'django.contrib.authenticated',\n```","id":"33631c5b-2c47-465f-b45e-0ccfc7116b6a","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-4"},{"bbox":[96,158,180,168],"index":5,"angle":0,"type":"code","text":"```javascript\n'django.contrib.messages',\n```","id":"3bc27b49-9a6e-42f9-8714-3cc877b34599","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-5"},{"bbox":[96,174,177,183],"index":6,"angle":0,"type":"code","text":"```javascript\n'django.contrib(staticfiles',\n```","id":"c3ec0da4-3fb1-4531-9f78-f948e8cd78fc","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-6"},{"bbox":[87,189,312,199],"type":"text","angle":0,"index":7,"text":")django.contrib 是一套庞大的功能集，它是 Django 基本代码的组成部分。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"b8f35c0a-7028-469e-9d37-b4355bce85e8","page_size":[595,841],"block_position":"30-7"},{"bbox":[88,212,171,228],"type":"title","angle":0,"index":8,"text":"# 激活管理工具","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":30,"id":"1fa6a5b7-45de-4870-8af3-e42aa1f94326","page_size":[595,841],"block_position":"30-8"},{"bbox":[87,241,320,251],"type":"text","angle":0,"index":9,"text":"通常我们在生成项目时会在urls.py 中自动设置好，我们只需去掉注释即可。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"3980677c-c537-44e1-9c3e-5849a2cfbc28","page_size":[595,841],"block_position":"30-9"},{"bbox":[88,256,142,266],"type":"text","angle":0,"index":10,"text":"配置项如下所示：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"4a55bc36-450a-42ac-9bed-0defa74c53ec","page_size":[595,841],"block_position":"30-10"},{"bbox":[87,272,218,282],"index":11,"angle":0,"type":"code","text":"```txt\n/HelloWorld/HelloWorld/url.py文件代码：\n```","id":"e7b32479-107a-490d-b774-dcdede9612f6","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-11"},{"bbox":[88,288,117,297],"index":12,"angle":0,"type":"code","text":"```txt\nurls.py\n```","id":"0db529a2-e532-4659-92ba-b827446ec111","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-12"},{"bbox":[88,303,186,312],"index":13,"angle":0,"type":"code","text":"```python\nfrom django.conf.urls import url\n```","id":"a28794a8-3f24-4c03-9c16-46bcead712e7","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-13"},{"bbox":[88,318,192,328],"index":14,"angle":0,"type":"code","text":"```python\nfrom django.contrib import admin\n```","id":"5db55029-590a-4531-8bb8-a898055b97ff","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-14"},{"bbox":[88,334,133,344],"index":15,"angle":0,"type":"algorithm","text":"urlpatterns  $=$  [","id":"d2ae463e-ac2c-4307-b12b-29acd77df019","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-15"},{"bbox":[96,349,190,359],"index":16,"angle":0,"type":"code","text":"```javascript\nurl(r'^admin\"', admin.site.url),\n```","id":"4e170c80-9e31-4158-8074-e004adb0181c","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-16"},{"bbox":[88,366,93,375],"index":17,"angle":0,"type":"code","text":"```txt\n]\n```","id":"21b1c20c-c601-4a15-a88e-e8c6c7f35ff7","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-17"},{"bbox":[88,380,257,391],"type":"text","angle":0,"index":18,"text":"当这一切都配置好后，Django 管理工具就可以运行了。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"d92ae2d5-ab9c-415a-a2b2-0e94563f4824","page_size":[595,841],"block_position":"30-18"},{"bbox":[87,396,348,407],"type":"text","angle":0,"index":19,"text":"你可以通过命令 python manage.py createsuperuser 来创建超级用户，如下所示：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"5eaaf43c-8651-4edf-a352-9c6fa5a0d821","page_size":[595,841],"block_position":"30-19"},{"bbox":[88,412,207,423],"index":20,"angle":0,"type":"code","text":"```batch\npython manage.py createsuperuser\n```","id":"67779e3f-e375-4718-a738-6ffdd8ad4630","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-20"},{"bbox":[88,428,224,438],"index":21,"angle":0,"type":"code","text":"```txt\nUsername (leave blank to use 'root'): admin\n```","id":"e3727482-cc7b-4b1f-aa8e-067a654cd778","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-21"},{"bbox":[88,444,201,453],"index":22,"angle":0,"type":"code","text":"```txt\nEmail address: admin@runoob.com\n```","id":"1e7b2660-53b7-46db-8a14-ff9cb013203a","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-22"},{"bbox":[88,460,122,468],"index":23,"angle":0,"type":"code","text":"```txt\nPassword:\n```","id":"a916b60c-01b9-42c9-bff7-cd72804f9b69","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-23"},{"bbox":[88,475,146,485],"index":24,"angle":0,"type":"code","text":"```txt\nPassword (again):\n```","id":"be896893-05d8-4a06-a115-c1a95bf83857","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-24"},{"bbox":[88,490,189,500],"index":25,"angle":0,"type":"code","text":"```txt\nSuperuser created successfully.\n```","id":"c3a2e198-bb6e-45ad-8273-4f8ef831de1b","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-25"},{"bbox":[88,506,168,516],"index":26,"angle":0,"type":"code","text":"```txt\n[root@solar HelloWorld]#\n```","id":"2abeef37-a6a3-4d78-ab9c-1641e3bf7f2e","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-26"},{"bbox":[88,529,144,544],"type":"title","angle":0,"index":27,"text":"# 复杂模型","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":30,"id":"6241b0ae-b877-4a0a-b696-4385b42d0a87","page_size":[595,841],"block_position":"30-27"},{"bbox":[87,557,275,567],"type":"text","angle":0,"index":28,"text":"管理页面的功能强大，完全有能力处理更加复杂的数据模型。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"e1f9ab30-f17c-4f1f-9dd8-b05787b30943","page_size":[595,841],"block_position":"30-28"},{"bbox":[88,573,200,583],"index":29,"angle":0,"type":"code","text":"```txt\ndjango-admin.py startproject app01\n```","id":"4e6f8334-2c47-4240-ba58-278b6c600237","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-29"},{"bbox":[88,588,285,598],"type":"text","angle":0,"index":30,"text":"接下来在 settings.py 中找到 INSTALLED_APPS 这一项，如下：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":30,"id":"a57b95b3-1b92-46c5-b01b-d619790014ab","page_size":[595,841],"block_position":"30-30"},{"bbox":[88,604,161,613],"index":31,"angle":0,"type":"code","text":"```txt\nINSTALLED_APPS = (\n```","id":"6427d082-9cf8-4654-b3f2-fce6296e1006","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-31"},{"bbox":[96,620,167,629],"index":32,"angle":0,"type":"code","text":"```txt\n'django.contrib_admin',\n```","id":"22da6ce9-f7a2-4891-b976-212d1cc3dcbf","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-32"},{"bbox":[96,635,162,645],"index":33,"angle":0,"type":"code","text":"```txt\n'django.contrib.auth',\n```","id":"53f8f48a-b6d5-4c48-b85d-ae69c1df18a4","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-33"},{"bbox":[96,650,188,661],"index":34,"angle":0,"type":"code","text":"```python\n'django.contrib.contenttypes',\n```","id":"ed6d555e-5e20-426d-a1b3-a9ee1789c83c","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-34"},{"bbox":[96,666,176,677],"index":35,"angle":0,"type":"code","text":"```javascript\n'django.contribsessions',\n```","id":"d1056e6a-8d85-436f-89bb-9059aed54981","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-35"},{"bbox":[96,682,180,692],"index":36,"angle":0,"type":"code","text":"```javascript\n'django.contrib.messages',\n```","id":"f5f29342-fdd4-4264-ba84-42d3596e5007","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-36"},{"bbox":[96,698,177,707],"index":37,"angle":0,"type":"code","text":"```javascript\n'django.contrib(staticfiles',\n```","id":"efdda23e-e621-4bc1-b00d-f3bdd611b690","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-37"},{"bbox":[96,713,196,723],"index":38,"angle":0,"type":"code","text":"```txt\n'testmodel', # 添加此项\n```","id":"e30bcd8e-810f-4468-a508-c7a0544da787","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-38"},{"bbox":[88,729,93,739],"index":39,"angle":0,"type":"code","text":"```txt\n）\n```","id":"1f733d09-1a9c-43a5-926e-b7500452595f","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":30,"page_size":[595,841],"block_position":"30-39"}],[{"bbox":[88,85,119,101],"type":"title","angle":0,"index":0,"text":"# 建表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":31,"id":"7d9db9ec-e0d8-457d-b316-565e70d02de6","page_size":[595,841],"block_position":"31-0"},{"bbox":[88,137,268,148],"type":"text","angle":0,"index":1,"text":"先在 TestModel/models.py 中增加一个更复杂的数据模型：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"7004d5ce-9165-4fbf-bb2f-6dff54aed832","page_size":[595,841],"block_position":"31-1"},{"bbox":[88,153,227,163],"type":"text","angle":0,"index":2,"text":"HelloWorld/TestModel/models.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"79c37de8-41b0-4527-ab8b-3afdc7043e3f","page_size":[595,841],"block_position":"31-2"},{"bbox":[88,168,183,179],"type":"text","angle":0,"index":3,"text":"from django.db import models","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"4dcc0a2e-9d44-4cc0-9436-f14ff4a34b41","page_size":[595,841],"block_position":"31-3"},{"bbox":[88,200,176,210],"type":"text","angle":0,"index":4,"text":"# Create your models here.","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"5a46d13c-cf50-4b74-9ae6-e6d02b55b5a5","page_size":[595,841],"block_position":"31-4"},{"bbox":[88,215,171,225],"type":"text","angle":0,"index":5,"text":"class Test(models.Model):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"6fee0d73-0f1a-46a4-ab4c-87ab4cabe486","page_size":[595,841],"block_position":"31-5"},{"bbox":[96,230,231,241],"index":6,"angle":0,"type":"code","text":"```python\nname = models.CharField(max_length=20)\n```","id":"b6220fbb-b7c9-405c-8c43-ea5dbbc45e5b","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-6"},{"bbox":[88,262,183,272],"type":"text","angle":0,"index":7,"text":"class Contact(models.Model):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"28716cc9-ba0d-4cd5-83da-6778dbe67d5a","page_size":[595,841],"block_position":"31-7"},{"bbox":[96,277,239,287],"index":8,"angle":0,"type":"algorithm","text":"name  $=$  models.CharField(max_length=200)","id":"79fab2d9-ef7e-4f84-baa2-e20e8971d945","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-8"},{"bbox":[96,293,218,303],"index":9,"angle":0,"type":"algorithm","text":"age  $=$  models.IntegerField(default=0)","id":"4c12a653-4e79-418a-8700-445e8637dc42","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-9"},{"bbox":[96,309,186,318],"index":10,"angle":0,"type":"code","text":"```txt\nemail = models.EmailField()\n```","id":"0e679391-0c40-4c6d-9af0-46b5938ce6d2","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-10"},{"bbox":[96,324,167,334],"index":11,"angle":0,"type":"code","text":"```python\ndef __unicode__(self):\n```","id":"5744b58e-d960-48b1-9a0d-ddaa4136e72f","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-11"},{"bbox":[103,340,157,349],"index":12,"angle":0,"type":"code","text":"```lua\nreturn self.name\n```","id":"24959fab-4712-40a5-a01d-3fe7f34682be","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-12"},{"bbox":[88,370,170,380],"type":"text","angle":0,"index":13,"text":"class Tag(models.Model):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"b14f4026-5ded-48b4-a048-ce25408b3659","page_size":[595,841],"block_position":"31-13"},{"bbox":[96,386,316,396],"index":14,"angle":0,"type":"code","text":"```python\ncontact = models.FireignKey(Contact, on_delete=models.CASCADE,)\n```","id":"f2068228-4840-40ae-a4ba-dda9535e094d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-14"},{"bbox":[96,402,236,412],"index":15,"angle":0,"type":"algorithm","text":"name  $=$  models.CharField(max_length=50)","id":"8bcdcf31-f35a-4a80-bc19-c8eac6928a1e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-15"},{"bbox":[96,417,167,428],"index":16,"angle":0,"type":"code","text":"```python\ndef __unicode__(self):\n```","id":"2982e67a-c258-4a12-87ed-ba1309ae47db","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-16"},{"bbox":[103,433,157,442],"index":17,"angle":0,"type":"code","text":"```lua\nreturn self.name\n```","id":"436304f5-268a-46cb-abc1-7d65da2907f6","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":31,"page_size":[595,841],"block_position":"31-17"},{"bbox":[88,449,321,460],"type":"text","angle":0,"index":18,"text":"这里有两个表。Tag 以 Contact 为外部键。一个 Contact 可以对应多个 Tag。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"8d6d03a6-e0aa-47cd-8f72-b5e2486db5a6","page_size":[595,841],"block_position":"31-18"},{"bbox":[87,480,344,491],"type":"text","angle":0,"index":19,"text":"我们还可以看到许多在之前没有见过的属性类型，比如 IntegerField 用于存储整数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"587e1073-1fbe-4823-86a9-c23290aa47f1","page_size":[595,841],"block_position":"31-19"},{"bbox":[88,514,201,533],"type":"title","angle":0,"index":20,"text":"# 用 django 创建表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":31,"id":"be51a11d-767a-4644-a97c-e743146a9527","page_size":[595,841],"block_position":"31-20"},{"bbox":[87,567,226,577],"type":"text","angle":0,"index":21,"text":"$ python manage.py migrate # 创建表结构","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"33895a39-90f4-458c-ac91-7d6a62256c51","page_size":[595,841],"block_position":"31-21"},{"bbox":[87,582,319,592],"type":"text","angle":0,"index":22,"text":"python manage.py makemigrations testmodel 让模型知道我们的表有变更","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"8d5b8c85-b391-4693-b47f-57ab640e7811","page_size":[595,841],"block_position":"31-22"},{"bbox":[88,597,243,608],"type":"text","angle":0,"index":23,"text":"python manage.py migrate TestModel 创建表结构","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"90f5664e-cb30-449a-81f9-ea8a76c7a550","page_size":[595,841],"block_position":"31-23"},{"bbox":[87,613,349,624],"type":"text","angle":0,"index":24,"text":"接下来我们在 app01 项目里添加 views.py 和 models.py 文件，app01 项目目录结构：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"e789f8ba-6bef-4a5c-a85b-ae15afdfc46c","page_size":[595,841],"block_position":"31-24"},{"bbox":[88,629,110,639],"type":"text","angle":0,"index":25,"text":"app01","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"6ba1f70e-6029-443e-bb65-619caaadb291","page_size":[595,841],"block_position":"31-25"},{"bbox":[88,645,117,654],"type":"text","angle":0,"index":26,"text":"|-- app01","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"ddbb4adf-0998-46d9-ad0a-7ca64f1ef8c4","page_size":[595,841],"block_position":"31-26"},{"bbox":[88,661,141,671],"type":"text","angle":0,"index":27,"text":"| |-- __init__.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"aa7c35b7-a938-4ba9-b792-58c4392079eb","page_size":[595,841],"block_position":"31-27"},{"bbox":[88,676,148,686],"type":"text","angle":0,"index":28,"text":"| |-- __pycache__","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"7c1dbc47-299a-4947-b7e3-e084aa9439df","page_size":[595,841],"block_position":"31-28"},{"bbox":[88,692,129,701],"type":"text","angle":0,"index":29,"text":"| |-- asgi.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"17c49632-04fa-48f2-a145-fd2ebd44a3f7","page_size":[595,841],"block_position":"31-29"},{"bbox":[88,707,139,717],"type":"text","angle":0,"index":30,"text":"| |-- migrations","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"7690f3cc-e607-4003-adc6-5aee27fd8af5","page_size":[595,841],"block_position":"31-30"},{"bbox":[88,723,139,732],"type":"text","angle":0,"index":31,"text":"| |-- models.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"cc9b9598-de09-466d-b7e5-6385217f2038","page_size":[595,841],"block_position":"31-31"},{"bbox":[88,738,140,748],"type":"text","angle":0,"index":32,"text":"| |-- settings.py","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":31,"id":"f9ee673f-3f9f-407b-8fba-891b264f5420","page_size":[595,841],"block_position":"31-32"}],[{"bbox":[87,80,127,89],"type":"text","angle":0,"index":0,"text":"| |-- urls.py","id":"a8448140-02d6-4b68-b1cb-9086b7dbe2ab","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"page_size":[595,841],"block_position":"32-0"},{"bbox":[88,95,133,105],"type":"text","angle":0,"index":1,"text":"| |-- views.py","id":"286fabcf-d765-428d-896b-032122ebefd3","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"page_size":[595,841],"block_position":"32-1"},{"bbox":[88,111,130,121],"type":"text","angle":0,"index":2,"text":"| `-- wsgi.py","id":"bc302474-7204-42d3-a08d-805e2cf81496","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"page_size":[595,841],"block_position":"32-2"},{"bbox":[88,162,146,178],"type":"title","angle":0,"index":4,"text":"# 显示模型","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":32,"id":"c4b4a02c-2b78-4b2d-933d-c6d7ae7e4255","page_size":[595,841],"block_position":"32-3"},{"bbox":[87,212,292,226],"type":"text","angle":0,"index":5,"text":"在 TestModel/admin.py 注册多个模型并显示：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"6f5771bf-625b-49cf-9253-3aeec3185ae1","page_size":[595,841],"block_position":"32-4"},{"bbox":[87,244,224,254],"type":"text","angle":0,"index":6,"text":"HelloWorld/TestModel/admin.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"8ffabdac-2611-4ff5-a4e3-3e4f9b87366d","page_size":[595,841],"block_position":"32-5"},{"bbox":[87,260,192,269],"type":"text","angle":0,"index":7,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"c3c31723-615a-45ca-800e-f29f622390b6","page_size":[595,841],"block_position":"32-6"},{"bbox":[87,276,238,285],"type":"text","angle":0,"index":8,"text":"from TestModel.models import Test,Contact,Tag","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"c139ca26-eebe-45b8-ad0d-952fd94b0215","page_size":[595,841],"block_position":"32-7"},{"bbox":[87,307,180,317],"type":"text","angle":0,"index":9,"text":"# Register your models here.","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"e170f45f-c786-4ce3-bbdf-2019c2f5ebbd","page_size":[595,841],"block_position":"32-8"},{"bbox":[87,322,211,333],"type":"text","angle":0,"index":10,"text":"admin.site.register([Test, Contact, Tag])","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"eeac380e-ade4-44e9-9d2e-a42373a8d31d","page_size":[595,841],"block_position":"32-9"},{"bbox":[87,357,277,374],"type":"title","angle":0,"index":11,"text":"# 每个栏也可以定义自己的格式。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":32,"id":"b024aa70-ac85-4044-a54a-cc04673a6908","page_size":[595,841],"block_position":"32-10"},{"bbox":[87,409,180,419],"type":"text","angle":0,"index":12,"text":"修改 TestModel/admin.py 为：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"7fcb4e4e-bf91-4006-9058-d341feb4048a","page_size":[595,841],"block_position":"32-11"},{"bbox":[87,440,223,450],"type":"text","angle":0,"index":13,"text":"HelloWorld/TestModel/admin.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"b8f916f0-e8cf-4596-9167-bbc97c253b6c","page_size":[595,841],"block_position":"32-12"},{"bbox":[87,456,192,465],"type":"text","angle":0,"index":14,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"d5b0f133-8035-46d3-a4cf-92b83e6127ff","page_size":[595,841],"block_position":"32-13"},{"bbox":[87,471,238,481],"type":"text","angle":0,"index":15,"text":"from TestModel.models import Test,Contact,Tag","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"3a3e9038-8ca2-43b3-93dd-b248a1f902d9","page_size":[595,841],"block_position":"32-14"},{"bbox":[87,502,180,512],"type":"text","angle":0,"index":16,"text":"# Register your models here.","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"6ebb7df9-0780-4b47-9a6c-95bef2f21540","page_size":[595,841],"block_position":"32-15"},{"bbox":[87,518,218,528],"type":"text","angle":0,"index":17,"text":"class ContactAdmin(admin.ModelAdmin):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"d0def746-ab48-4c2a-99d3-c4aac76057ac","page_size":[595,841],"block_position":"32-16"},{"bbox":[87,534,203,667],"index":18,"angle":0,"type":"code","text":"```python\nfieldsets = (\n    ['Main', {\n        'fields': ('name', 'email'),\n    }],\n    ['Advance', {\n        'classes': ('collapse'), # CSS\n        'fields': ('age'), }\n    }])\n```","id":"1873ff7c-2952-40b7-b189-3345c3a7ed7a","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":32,"page_size":[595,841],"block_position":"32-17"},{"bbox":[87,690,224,699],"type":"text","angle":0,"index":19,"text":"admin.site.register(Contact, ContactAdmin)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"0a0341ef-41b0-4af2-8032-8af495ad29bf","page_size":[595,841],"block_position":"32-18"},{"bbox":[87,705,184,714],"type":"text","angle":0,"index":20,"text":"admin.site.register([Test, Tag])","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"2e841b2d-e02c-49d8-bc71-3bf40015c2e8","page_size":[595,841],"block_position":"32-19"},{"bbox":[87,720,440,730],"type":"text","angle":0,"index":21,"text":"上面的栏目分为了Main 和Advance 两部分。classes 说明它所在的部分的CSS 格式。这里让Advance 部分隐藏：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":32,"id":"28e436e6-6c47-4b02-8304-78907c143f65","page_size":[595,841],"block_position":"32-20"}],[{"bbox":[88,85,196,103],"type":"title","angle":0,"index":0,"text":"# 内联(Inline)显示","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":33,"id":"aaca57a1-b71a-456d-a69d-31e575f677d7","page_size":[595,841],"block_position":"33-0"},{"bbox":[87,137,268,147],"type":"text","angle":0,"index":1,"text":"上面的Contact 是Tag 的外部键，所以有外部参考的关系。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"cc64aaae-3994-4c41-a9b4-a623df37c6ff","page_size":[595,841],"block_position":"33-1"},{"bbox":[86,153,504,177],"type":"text","angle":0,"index":2,"text":"而在默认的页面显示中，将两者分离开来，无法体现出两者的从属关系。我们可以使用内联显示，让 Tag 附加在Contact 的编辑页面上显示。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"f3a92b0e-fdcf-443f-94e7-2e4c2e0883f4","page_size":[595,841],"block_position":"33-2"},{"bbox":[87,185,170,193],"type":"text","angle":0,"index":3,"text":"修改 TestModel/admin.py：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"072bd6db-4092-45d5-9de6-31ee33ab6b2c","page_size":[595,841],"block_position":"33-3"},{"bbox":[87,200,230,209],"type":"text","angle":0,"index":4,"text":"HelloWorld/TestModel/admin.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"0fb7b0f4-c0ed-47e3-98cd-03f705cc0479","page_size":[595,841],"block_position":"33-4"},{"bbox":[87,215,192,223],"type":"text","angle":0,"index":5,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"17d14adc-485b-46d0-bc13-fde29f16a83e","page_size":[595,841],"block_position":"33-5"},{"bbox":[87,231,238,239],"type":"text","angle":0,"index":6,"text":"from TestModel.models import Test,Contact,Tag","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"6b997c2c-866f-4154-ac18-0de2fe37fc6b","page_size":[595,841],"block_position":"33-6"},{"bbox":[87,262,179,270],"type":"text","angle":0,"index":7,"text":"# Register your models here.","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"50f6a664-7868-4861-a4e8-8df59b8246f3","page_size":[595,841],"block_position":"33-7"},{"bbox":[87,277,202,285],"type":"text","angle":0,"index":8,"text":"class TagInline(admin.TabularInline):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"4958c94f-3ca5-4771-9151-46d287b18c3a","page_size":[595,841],"block_position":"33-8"},{"bbox":[96,294,135,302],"type":"text","angle":0,"index":9,"text":"model = Tag","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"3651cf06-9768-442e-806b-e3627b8b2720","page_size":[595,841],"block_position":"33-9"},{"bbox":[87,324,218,333],"type":"text","angle":0,"index":10,"text":"class ContactAdmin(admin.ModelAdmin):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"8c8ee405-4edf-4d6c-8d71-62f83285c155","page_size":[595,841],"block_position":"33-10"},{"bbox":[96,340,183,349],"type":"text","angle":0,"index":11,"text":"inlines $=$ [TagInline] # Inline","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"2a359a88-2b2a-4c1b-a2f6-f9e52f8e57cb","page_size":[595,841],"block_position":"33-11"},{"bbox":[96,355,134,364],"type":"text","angle":0,"index":12,"text":"fieldsets = (","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"cd2d4f92-1ac1-412c-8fe9-cdb7a2c35d88","page_size":[595,841],"block_position":"33-12"},{"bbox":[104,371,129,380],"type":"text","angle":0,"index":13,"text":"['Main',{","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"fc06a882-9a5d-41c8-b9e2-55b819cb94c6","page_size":[595,841],"block_position":"33-13"},{"bbox":[111,387,182,396],"type":"text","angle":0,"index":14,"text":"'fields':('name','email'),","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"afd40f8b-ceac-4096-be68-f95add3795ee","page_size":[595,841],"block_position":"33-14"},{"bbox":[104,403,110,411],"type":"text","angle":0,"index":15,"text":"}],","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"81e61c6f-041f-4e49-bf1b-699e44a736d7","page_size":[595,841],"block_position":"33-15"},{"bbox":[104,417,141,426],"type":"text","angle":0,"index":16,"text":"['Advance',{","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"3f5dc96a-5295-4497-83ec-ac4b836a6e69","page_size":[595,841],"block_position":"33-16"},{"bbox":[111,433,179,443],"type":"text","angle":0,"index":17,"text":"'classes': ('collapse',),","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"2916fbcf-41d3-4d24-9939-594141907d56","page_size":[595,841],"block_position":"33-17"},{"bbox":[112,449,159,458],"type":"text","angle":0,"index":18,"text":"'fields': ('age',),","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"fad6e95d-272f-45ee-9ad6-c499763c516c","page_size":[595,841],"block_position":"33-18"},{"bbox":[104,465,110,473],"type":"text","angle":0,"index":19,"text":"}]","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"19b60cf6-6072-4b78-87c5-ad71231601ab","page_size":[595,841],"block_position":"33-19"},{"bbox":[94,496,100,504],"type":"text","angle":0,"index":20,"text":")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"0adb07a9-92c3-4993-934f-a89aee38ceaa","page_size":[595,841],"block_position":"33-20"},{"bbox":[87,527,223,536],"type":"text","angle":0,"index":21,"text":"admin.site.register(Contact, ContactAdmin)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"0e42eea6-c12f-405a-942a-6db2ece03f38","page_size":[595,841],"block_position":"33-21"},{"bbox":[88,543,168,551],"type":"text","angle":0,"index":22,"text":"admin.site.register([Test])","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"066c2b6e-2343-4f85-8d10-d78c11ad7e54","page_size":[595,841],"block_position":"33-22"},{"bbox":[88,577,216,593],"type":"title","angle":0,"index":23,"text":"# 自定义该页面的显示","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":33,"id":"3140e952-30cd-464f-be91-625cc23807c8","page_size":[595,841],"block_position":"33-23"},{"bbox":[87,629,338,639],"type":"text","angle":0,"index":24,"text":"比如在列表中显示更多的栏目，只需要在 ContactAdmin 中增加 list_display 属性:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"e084f237-5428-4220-a193-6e12534bfdb5","page_size":[595,841],"block_position":"33-24"},{"bbox":[87,661,223,669],"type":"text","angle":0,"index":25,"text":"HelloWorld/TestModel/admin.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"6cb91966-2549-4750-a836-569c308bf763","page_size":[595,841],"block_position":"33-25"},{"bbox":[87,677,192,684],"type":"text","angle":0,"index":26,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"08e27e32-8d0b-463f-9fe4-fe1f79c76950","page_size":[595,841],"block_position":"33-26"},{"bbox":[87,692,237,700],"type":"text","angle":0,"index":27,"text":"from TestModel.models import Test,Contact,Tag","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"dd82c3cd-c923-4a01-806e-246d669f39ea","page_size":[595,841],"block_position":"33-27"},{"bbox":[87,723,179,731],"type":"text","angle":0,"index":28,"text":"# Register your models here.","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"1b03d692-a92f-4fb6-99df-aece1a062cd0","page_size":[595,841],"block_position":"33-28"},{"bbox":[87,738,202,747],"type":"text","angle":0,"index":29,"text":"class TagInline(admin.TabularInline):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":33,"id":"b34e248e-1a95-465b-a072-ff6fd5c64b09","page_size":[595,841],"block_position":"33-29"}],[{"bbox":[88,79,223,356],"index":0,"angle":0,"type":"algorithm","text":"model  $=$  Tag   \nclass ContactAdmin(admin.ModelAdmin): list_display  $\\equiv$  ('name','age'，'email')#list inlines  $=$  [TagInline] # Inline fieldsets  $=$  ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes':('collapse'), 'fields':('age'), }]}   \n）   \nadmin.site.register(Contact,ContactAdmin)   \nadmin.site.register([Test])","id":"739a8285-a28e-4ed8-af48-909370adb7d6","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":34,"page_size":[595,841],"block_position":"34-0"},{"bbox":[88,380,147,396],"type":"title","angle":0,"index":1,"text":"# 搜索功能","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":34,"id":"2b45ceda-d3e5-4e4f-ad77-38053486f7c0","page_size":[595,841],"block_position":"34-1"},{"bbox":[88,432,207,442],"type":"text","angle":0,"index":2,"text":"search_fields 为该列表页增加搜索栏：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":34,"id":"670c6df3-cb1b-4837-a348-ca6e057c1322","page_size":[595,841],"block_position":"34-2"},{"bbox":[88,463,238,505],"index":3,"angle":0,"type":"code","text":"```python\nHelloWorld/TestModel/admin.py:文件代码：  \nfrom django.contrib import admin  \nfrom TestModel.models import Test,Contact,Tag\n```","id":"f641938e-0ff6-46a8-a252-b4c9cdfeb800","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":34,"page_size":[595,841],"block_position":"34-3"},{"bbox":[88,524,221,753],"index":4,"angle":0,"type":"algorithm","text":"# Register your models here.   \nclass TagInline(admin.TabularInline): model  $=$  Tag   \nclass ContactAdmin(admin.ModelAdmin): list_display  $\\equiv$  ('name','age'，'email') #list search_fields  $=$  ('name') inlines  $=$  [TagInline] # Inline fieldsets  $=$  ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes':('collapse'), 'fields':('age'),","id":"a46cfcdb-a8c5-4eae-b351-c5a15a56e5d1","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":34,"page_size":[595,841],"block_position":"34-4"}],[{"bbox":[104,81,110,89],"type":"text","angle":0,"index":0,"text":"}]","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"3a7e8a0f-4f8c-445a-a275-b723feb525ab","page_size":[595,841],"block_position":"35-0"},{"bbox":[96,111,100,120],"type":"text","angle":0,"index":1,"text":")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"caa78169-6d7a-4365-be5a-10364c327c4f","page_size":[595,841],"block_position":"35-1"},{"bbox":[88,142,224,152],"type":"text","angle":0,"index":2,"text":"admin.site.register(Contact, ContactAdmin)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"307000e7-e86e-4d58-842b-684f64abd4df","page_size":[595,841],"block_position":"35-2"},{"bbox":[88,158,168,167],"type":"text","angle":0,"index":3,"text":"admin.site.register([Test])","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"db398bdb-04f8-4e9e-9d1a-f0579598d0f2","page_size":[595,841],"block_position":"35-3"},{"bbox":[87,174,500,184],"type":"text","angle":0,"index":4,"text":"在 django2.0 后，定义外键和一对一关系的时候需要加 on_delete 选项，此参数为了避免两个表里的数据不一致问题，不然会报错：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"4b3b7be1-ed47-4be4-b959-10756bfe82a3","page_size":[595,841],"block_position":"35-4"},{"bbox":[88,190,334,199],"type":"text","angle":0,"index":5,"text":"TypeError: __init__() missing 1 required positional argument: 'on_delete'。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"599fafd7-8b0a-408c-a9df-0262ddf18634","page_size":[595,841],"block_position":"35-5"},{"bbox":[87,205,485,214],"type":"text","angle":0,"index":6,"text":"owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数（models.CASCADE）是默认值参数","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"abda92af-7cb3-426c-b293-13239e350f4c","page_size":[595,841],"block_position":"35-6"},{"bbox":[87,221,403,230],"type":"text","angle":0,"index":7,"text":"说明：on_delete 有 CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET() 五个可选择的值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"2f697f01-aa23-432e-84bc-64ca8c6633c1","page_size":[595,841],"block_position":"35-7"},{"bbox":[105,236,242,246],"type":"text","angle":0,"index":8,"text":"CASCADE：此值设置，是级联删除。","id":"e97c4b0b-d989-4cf4-b282-ce49b9b7ddcb","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"page_size":[595,841],"block_position":"35-8"},{"bbox":[105,251,262,261],"type":"text","angle":0,"index":9,"text":". PROTECT：此值设置，是会报完整性错误。","id":"386bed11-16e0-478d-9733-2b2bbca7c777","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"page_size":[595,841],"block_position":"35-9"},{"bbox":[105,267,332,277],"type":"text","angle":0,"index":10,"text":". SET_NULL：此值设置，会把外键设置为null，前提是允许为null。","id":"b07a68db-e1e1-48fa-b561-9a0a83b4658b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"page_size":[595,841],"block_position":"35-10"},{"bbox":[105,282,299,292],"type":"text","angle":0,"index":11,"text":". SET_DEFAULT：此值设置，会把设置为外键的默认值。","id":"2e2b245f-b433-4d48-92a5-7d21bdc0ff74","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"page_size":[595,841],"block_position":"35-11"},{"bbox":[105,298,417,308],"type":"text","angle":0,"index":12,"text":"SET()：此值设置，会调用外面的值，可以是一个函数。一般情况下使用CASCADE 就可以了。","id":"189c805a-8215-479d-a60d-460614561348","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"page_size":[595,841],"block_position":"35-12"},{"bbox":[88,314,248,323],"type":"text","angle":0,"index":14,"text":"如果你之前还未创建表结构，可使用以下命令创建：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"00965133-2b0b-4663-a84f-15015a192c22","page_size":[595,841],"block_position":"35-13"},{"bbox":[87,329,386,339],"type":"text","angle":0,"index":15,"text":"$ python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"d4f5e3fe-024e-421d-bf06-9e6bcdc9b29d","page_size":[595,841],"block_position":"35-14"},{"bbox":[88,345,259,355],"type":"text","angle":0,"index":16,"text":"$ python manage.py migrate TestModel # 创建表结构","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"91ba45ad-1b74-47fe-96f2-6671b16970a6","page_size":[595,841],"block_position":"35-15"},{"bbox":[88,380,159,396],"type":"title","angle":0,"index":17,"text":"# 数据库添加","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":35,"id":"6afd9e1f-3a2a-459f-9de2-969f64d98e89","page_size":[595,841],"block_position":"35-16"},{"bbox":[88,432,121,441],"type":"text","angle":0,"index":18,"text":"规则配置：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"36e24295-6be8-45f1-8c9e-1760c78e6d1f","page_size":[595,841],"block_position":"35-17"},{"bbox":[87,463,167,472],"type":"text","angle":0,"index":19,"text":"app01/urls.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"c639f876-465a-4ac3-b0e8-01877361f93f","page_size":[595,841],"block_position":"35-18"},{"bbox":[88,478,192,487],"type":"text","angle":0,"index":20,"text":"from django.contrib import admin","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"2ff6cfce-4df1-442f-882e-ac75afd1212d","page_size":[595,841],"block_position":"35-19"},{"bbox":[88,494,177,503],"type":"text","angle":0,"index":21,"text":"from django.urls import path","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"43f29426-51a8-4952-8abe-6742b3cf4606","page_size":[595,841],"block_position":"35-20"},{"bbox":[88,510,149,518],"type":"text","angle":0,"index":22,"text":"from . import views","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"17ddc6d6-a664-4e99-be22-11b5cb4c5526","page_size":[595,841],"block_position":"35-21"},{"bbox":[88,541,133,550],"type":"text","angle":0,"index":23,"text":"urlpatterns = [","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"426887a6-eacc-4d56-8cc2-54cf436c0164","page_size":[595,841],"block_position":"35-22"},{"bbox":[96,556,207,565],"type":"text","angle":0,"index":24,"text":"path('add_book/', views.add_book),","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"b050d2da-ec26-4723-a64c-4f86a01ccf0d","page_size":[595,841],"block_position":"35-23"},{"bbox":[88,573,93,581],"type":"text","angle":0,"index":25,"text":"]","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"d6cd33a9-efe0-4e67-ba10-ab3a541be81a","page_size":[595,841],"block_position":"35-24"},{"bbox":[88,587,174,597],"type":"text","angle":0,"index":26,"text":"方式一：模型类实例化对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"a22a33f7-5325-45ff-9048-faa10d5ad2b3","page_size":[595,841],"block_position":"35-25"},{"bbox":[88,618,199,629],"type":"text","angle":0,"index":27,"text":"需从 app 目录引入 models.py 文件：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"221c47b4-215e-49c3-8f4c-5a4f49f5f93d","page_size":[595,841],"block_position":"35-26"},{"bbox":[87,650,179,659],"type":"text","angle":0,"index":28,"text":"from app 目录 import models","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"5c568fbe-476a-40f9-b0ce-faa38759c5ef","page_size":[595,841],"block_position":"35-27"},{"bbox":[87,666,286,675],"type":"text","angle":0,"index":29,"text":"并且实例化对象后要执行 对象.save() 才能在数据库中新增成功。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"12997032-8bd2-4056-873d-9525cc1621e5","page_size":[595,841],"block_position":"35-28"},{"bbox":[87,697,173,706],"type":"text","angle":0,"index":30,"text":"app01/views.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"c348347d-bfb4-410d-8744-2dbcec6d0e7f","page_size":[595,841],"block_position":"35-29"},{"bbox":[87,712,246,721],"type":"text","angle":0,"index":31,"text":"from django.shortcuts import render,HttpResponse","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"d5b5f82f-7372-4455-9e60-da49dce1ac7c","page_size":[595,841],"block_position":"35-30"},{"bbox":[88,728,171,737],"type":"text","angle":0,"index":32,"text":"from app01 import models","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"6e75e84f-31fa-42f7-b504-dd1e14a71ae4","page_size":[595,841],"block_position":"35-31"},{"bbox":[88,743,162,753],"type":"text","angle":0,"index":33,"text":"def add_book(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":35,"id":"97e35689-eb5b-4974-a7b6-3a9b32dbb34a","page_size":[595,841],"block_position":"35-32"}],[{"bbox":[93,79,381,89],"type":"text","angle":0,"index":0,"text":"book $=$ models.Book(title $! = \"$ 菜鸟教程\",price=300,publish=\"菜鸟出版社\",pub_date=\"2008-8-8\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"e6c57615-345b-480c-8111-b5a0f0eb5312","page_size":[595,841],"block_position":"36-0"},{"bbox":[95,96,134,105],"type":"text","angle":0,"index":1,"text":"book.save()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"a02526b9-c832-45a6-9c5e-b9215563292d","page_size":[595,841],"block_position":"36-1"},{"bbox":[95,111,247,121],"type":"text","angle":0,"index":2,"text":"return HttpResponse( $\" < p >$ 数据添加成功！ $< / { \\mathsf { p } } > \"$ )","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"4b2485f2-0cd6-49a1-a9ab-d26af76efefb","page_size":[595,841],"block_position":"36-2"},{"bbox":[88,126,301,136],"type":"text","angle":0,"index":3,"text":"方式二：通过 ORM 提供的 objects 提供的方法create 来实现（推荐）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"880b077f-8e74-4d83-8b7e-f588a10d622a","page_size":[595,841],"block_position":"36-3"},{"bbox":[88,158,173,168],"type":"text","angle":0,"index":4,"text":"app01/views.py: 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"6a541963-5dca-45fa-8f8a-9e2f14d4119e","page_size":[595,841],"block_position":"36-4"},{"bbox":[88,174,246,183],"type":"text","angle":0,"index":5,"text":"from django.shortcuts import render,HttpResponse","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"7941a87f-0107-4e34-9e27-1b05723c2341","page_size":[595,841],"block_position":"36-5"},{"bbox":[88,190,171,198],"type":"text","angle":0,"index":6,"text":"from app01 import models","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"9b0da517-8210-4c3a-a489-50ef141c6032","page_size":[595,841],"block_position":"36-6"},{"bbox":[88,205,162,214],"type":"text","angle":0,"index":7,"text":"def add_book(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"272d1e2d-4714-464b-a624-1832e72ed264","page_size":[595,841],"block_position":"36-7"},{"bbox":[95,221,440,230],"type":"text","angle":0,"index":8,"text":"books $=$ models.Book.objects.create(title=\"如来神掌\",price=200,publish=\"功夫出版社\",pub_date=\"2010-10-10\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"6b2e6767-c6de-464a-b174-b98ef95e58a3","page_size":[595,841],"block_position":"36-8"},{"bbox":[95,236,234,245],"type":"text","angle":0,"index":9,"text":"print(books, type(books)) # Book object (18)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"d5621f0a-c780-43aa-8562-ad5d82f5694b","page_size":[595,841],"block_position":"36-9"},{"bbox":[95,252,246,261],"type":"text","angle":0,"index":10,"text":"return HttpResponse(\"<p>数据添加成功！</p>\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"f6f58391-5428-41fa-8d41-a45bacd8f84c","page_size":[595,841],"block_position":"36-10"},{"bbox":[88,285,119,301],"type":"title","angle":0,"index":11,"text":"# 查找","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":36,"id":"b1bdf173-a461-4db4-9835-e42fa7c79cb9","page_size":[595,841],"block_position":"36-11"},{"bbox":[86,337,231,349],"type":"text","angle":0,"index":12,"text":"使用 all() 方法来查询所有内容。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"04d460db-67e3-4c4d-8dfb-59eeca89713a","page_size":[595,841],"block_position":"36-12"},{"bbox":[86,352,504,380],"type":"text","angle":0,"index":13,"text":"返回的是 QuerySet 类型数据，类似于 list，里面放的是一个个模型类的对象，可用索引下标取出模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"405c6fe1-55fb-4645-9735-6c0a2b83a88f","page_size":[595,841],"block_position":"36-13"},{"bbox":[95,384,160,396],"type":"text","angle":0,"index":14,"text":"（for I in books）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"3868fcfa-bee3-48df-a4dd-00229870c61a","page_size":[595,841],"block_position":"36-14"},{"bbox":[95,401,202,410],"type":"text","angle":0,"index":15,"text":"books $=$ models.Book.objects.all()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"35ed9243-abf6-4bf4-b88a-a10754ef7edc","page_size":[595,841],"block_position":"36-15"},{"bbox":[95,416,382,425],"type":"text","angle":0,"index":16,"text":"print(books,type(books)) # QuerySet 类型，类似于 list，访问 url 时数据显示在命令行窗口中。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"5ddc0f69-1ee4-428d-93af-856d9040678f","page_size":[595,841],"block_position":"36-16"},{"bbox":[87,450,221,467],"type":"title","angle":0,"index":17,"text":"# 查询符合条件的数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":36,"id":"b9362bea-dfca-4ca5-9cc7-7a9c844c6984","page_size":[595,841],"block_position":"36-17"},{"bbox":[87,503,124,512],"type":"text","angle":0,"index":18,"text":"filter() 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"96112b7d-7ac9-4a58-b9de-2a0f19f8bfcb","page_size":[595,841],"block_position":"36-18"},{"bbox":[86,518,444,528],"type":"text","angle":0,"index":19,"text":"返回的是 QuerySet 类型数据，类似于 list，里面放的是满足条件的模型类的对象，可用索引下标取出模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"59f17d1f-936f-4586-8bc8-3fa4c210ee31","page_size":[595,841],"block_position":"36-19"},{"bbox":[87,550,240,559],"type":"text","angle":0,"index":20,"text":"pk=3 的意思是主键 primary key=3，相当于 id=3。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"2b4e80b1-e468-4c76-a15c-f9c73fbc1551","page_size":[595,841],"block_position":"36-20"},{"bbox":[86,581,327,591],"type":"text","angle":0,"index":21,"text":"因为 id 在 pycharm 里有特殊含义，是看内存地址的内置函数 id()，因此用 pk。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"6380af25-4dab-4d49-9fa2-f664a229c71c","page_size":[595,841],"block_position":"36-21"},{"bbox":[94,611,224,621],"type":"text","angle":0,"index":22,"text":"books $=$ models.Book.objects.filter(pk=5)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"7a492aa1-3739-44ee-84d6-4eed58e0f595","page_size":[595,841],"block_position":"36-22"},{"bbox":[95,628,135,636],"type":"text","angle":0,"index":23,"text":"print(books)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"bb3d5b7e-dd59-4414-9fff-d4e59e0d7bf0","page_size":[595,841],"block_position":"36-23"},{"bbox":[95,643,195,652],"type":"text","angle":0,"index":24,"text":"print(\"//////////////////////////////////////\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"b3613023-4b6b-4570-88ec-7cea5975ab14","page_size":[595,841],"block_position":"36-24"},{"bbox":[95,659,307,668],"type":"text","angle":0,"index":25,"text":"books $=$ models.Book.objects.filter(publish='菜鸟出版社', price=300)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"f2738459-9120-4315-9744-86b74d718300","page_size":[595,841],"block_position":"36-25"},{"bbox":[95,675,270,684],"type":"text","angle":0,"index":26,"text":"print(books, type(books)) # QuerySet 类型，类似于 list。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":36,"id":"486f9075-20ae-443a-83d4-459f55d545c4","page_size":[595,841],"block_position":"36-26"}],[{"bbox":[88,85,235,101],"type":"title","angle":0,"index":0,"text":"# 查询不符合条件的数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":37,"id":"291863dd-cc06-4e91-9d22-77157f5d24c0","page_size":[595,841],"block_position":"37-0"},{"bbox":[86,137,135,147],"type":"text","angle":0,"index":1,"text":"exclude() 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"8663f704-6fc8-498e-ba45-be1bcb7e1f97","page_size":[595,841],"block_position":"37-1"},{"bbox":[86,153,451,163],"type":"text","angle":0,"index":2,"text":"返回的是 QuerySet 类型数据，类似于 list，里面放的是不满足条件的模型类的对象，可用索引下标取出模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"1bf3f047-7fc1-4f83-adef-c791ddb33b56","page_size":[595,841],"block_position":"37-2"},{"bbox":[95,168,235,178],"index":3,"angle":0,"type":"algorithm","text":"books  $=$  models.Book.objectsexclude(pk=5)","id":"4ad7b455-3910-435f-9a4d-fcb5a9b00c86","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"page_size":[595,841],"block_position":"37-3"},{"bbox":[95,184,135,193],"type":"text","angle":0,"index":4,"text":"print(books)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"1b50fe82-3ea3-4ae7-80f9-870ef810b4ac","page_size":[595,841],"block_position":"37-4"},{"bbox":[95,200,195,209],"index":5,"angle":0,"type":"code","text":"```txt\nprint(\"|||||||||||||||||||||||||||||||||\")\n```","id":"5efc7a45-a580-4bb0-a59a-5cf5c77ea76d","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":37,"page_size":[595,841],"block_position":"37-5"},{"bbox":[95,215,318,225],"type":"text","angle":0,"index":6,"text":"books $=$ models.Book.objects.exclude(publish='菜鸟出版社', price=300)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"f2892a38-aca7-45a9-855c-f40b493e002f","page_size":[595,841],"block_position":"37-6"},{"bbox":[95,231,271,241],"type":"text","angle":0,"index":7,"text":"print(books, type(books)) # QuerySet 类型，类似于 list。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"0ebaf964-1e9d-4522-8aa8-73ac26de4e08","page_size":[595,841],"block_position":"37-7"},{"bbox":[87,265,155,283],"type":"title","angle":0,"index":8,"text":"# get() 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":37,"id":"70cdd348-7149-4867-a528-45c90638ef56","page_size":[595,841],"block_position":"37-8"},{"bbox":[86,317,500,327],"type":"text","angle":0,"index":9,"text":"用于查询符合条件的返回模型类的对象符合条件的对象只能为一个，如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"1b1936c2-d7c2-4bf4-b4c4-81e1d579d7e2","page_size":[595,841],"block_position":"37-9"},{"bbox":[95,333,221,343],"index":10,"angle":0,"type":"algorithm","text":"books  $=$  models.Book.objects.get(pk=5)","id":"611e5ada-b73d-42f8-b9c0-a584586f9ef5","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"page_size":[595,841],"block_position":"37-10"},{"bbox":[95,349,318,358],"type":"text","angle":0,"index":11,"text":"books $=$ models.Book.objects.get ${ \\tt p k } { = } 1 8$ ) # 报错，没有符合条件的对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"516bbe09-1744-4e0c-9feb-92aa3f1e7a11","page_size":[595,841],"block_position":"37-11"},{"bbox":[95,364,343,374],"index":12,"angle":0,"type":"code","text":"```txt\nbooks = models.Book.objects.get(price=200) # 报错，符合条件的对象超过一个\n```","id":"5b368092-2b52-4d6f-adf2-5c986885e58f","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":37,"page_size":[595,841],"block_position":"37-12"},{"bbox":[95,380,227,390],"type":"text","angle":0,"index":13,"text":"print(books, type(books)) # 模型类的对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"702d12fc-c2c2-4d19-bb69-9b0af19df812","page_size":[595,841],"block_position":"37-13"},{"bbox":[87,414,118,430],"type":"title","angle":0,"index":14,"text":"# 排序","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":37,"id":"07a270a4-126e-47dc-8530-a17e05f5a4e6","page_size":[595,841],"block_position":"37-14"},{"bbox":[86,466,122,476],"type":"text","angle":0,"index":15,"text":"order_by()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"c5f3e300-772b-4e4c-b2ae-c4861f8d1494","page_size":[595,841],"block_position":"37-15"},{"bbox":[86,481,436,491],"type":"text","angle":0,"index":16,"text":"返回的是 QuerySet类型数据，类似于list，里面放的是排序后的模型类的对象，可用索引下标取出模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"cd799f9f-8ae2-4cb8-91e6-044ea1b821c2","page_size":[595,841],"block_position":"37-16"},{"bbox":[87,513,107,522],"type":"text","angle":0,"index":17,"text":"注意：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"8b29d6cc-ed8e-4b4a-9f99-dc023898c6cf","page_size":[595,841],"block_position":"37-17"},{"bbox":[87,544,174,553],"type":"text","angle":0,"index":18,"text":"a、参数的字段名要加引号。","id":"9b0d8770-41e7-4b30-b261-450c93645558","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"page_size":[595,841],"block_position":"37-18"},{"bbox":[87,560,192,569],"type":"text","angle":0,"index":19,"text":"b、降序为在字段前面加个负号-。","id":"555d7dc4-3e26-4e55-a55d-85d39702825e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"page_size":[595,841],"block_position":"37-19"},{"bbox":[95,576,343,585],"type":"text","angle":0,"index":21,"text":"books $=$ models.Book.objects.order_by(\"price\") # 查询所有，按照价格升序排列","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"2dafe50b-dd2f-4915-a69d-bce9c25c569c","page_size":[595,841],"block_position":"37-20"},{"bbox":[95,591,345,601],"type":"text","angle":0,"index":22,"text":"books $=$ models.Book.objects.order_by(\"-price\") # 查询所有，按照价格降序排列","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"bdf76186-8461-48d1-88a0-d8c63e52e1da","page_size":[595,841],"block_position":"37-21"},{"bbox":[87,626,220,641],"type":"title","angle":0,"index":23,"text":"# 对查询结果进行反转。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":37,"id":"1fb0daea-8f37-40b0-b010-ac3ad32f4b3f","page_size":[595,841],"block_position":"37-22"},{"bbox":[86,677,135,687],"type":"text","angle":0,"index":24,"text":"reverse() 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"bd1deb0f-0cbb-46fb-acc4-ba98e19225df","page_size":[595,841],"block_position":"37-23"},{"bbox":[86,692,438,703],"type":"text","angle":0,"index":25,"text":"返回的是 QuerySe t类型数据，类似于 list，里面放的是反转后的模型类的对象，可用索引下标取出模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"f25b006c-bc76-4724-987f-02ba7e6a15bb","page_size":[595,841],"block_position":"37-24"},{"bbox":[95,724,202,734],"type":"text","angle":0,"index":26,"text":"# 按照价格升序排列：降序再反转","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"3ef9beca-3349-483f-b925-3b5147c40635","page_size":[595,841],"block_position":"37-25"},{"bbox":[95,740,276,749],"type":"text","angle":0,"index":27,"text":"books $=$ models.Book.objects.order_by(\"-price\").reverse()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":37,"id":"4405f434-130e-42e0-8a21-d19e2ec7908f","page_size":[595,841],"block_position":"37-26"}],[{"bbox":[88,85,189,101],"type":"title","angle":0,"index":0,"text":"# 查询数据的数量","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":38,"id":"b375a821-23cd-47eb-9260-229bae17a810","page_size":[595,841],"block_position":"38-0"},{"bbox":[87,136,180,149],"type":"title","angle":0,"index":1,"text":"# 返回的数据是整数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":38,"id":"cafe09bb-959c-4301-a0c4-5f9cb7d24a53","page_size":[595,841],"block_position":"38-1"},{"bbox":[88,153,128,163],"type":"text","angle":0,"index":2,"text":"count() 方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"418f5001-c84d-4e4c-97af-fa8a624e1097","page_size":[595,841],"block_position":"38-2"},{"bbox":[95,168,285,179],"type":"text","angle":0,"index":3,"text":"books $=$ models.Book.objects.count() # 查询所有数据的数量","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"de891f4c-94f9-449e-9f57-37269a24b427","page_size":[595,841],"block_position":"38-3"},{"bbox":[95,184,349,195],"type":"text","angle":0,"index":4,"text":"books $=$ models.Book.objects.filter(price=200).count() # 查询符合条件数据的数量","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"273d18e2-97fa-4fe3-8604-4a3457d24e93","page_size":[595,841],"block_position":"38-4"},{"bbox":[87,200,324,210],"type":"text","angle":0,"index":5,"text":"first() 方法返回第一条数据返回的数据是模型类的对象也可以用索引下标 [0]。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"44aa824e-0998-4b0a-8398-3e61a91453e4","page_size":[595,841],"block_position":"38-5"},{"bbox":[95,215,299,225],"type":"text","angle":0,"index":6,"text":"books $=$ models.Book.objects.first() # 返回所有数据的第一条数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"eeea1413-89f3-413c-b942-46166a33fec5","page_size":[595,841],"block_position":"38-6"},{"bbox":[87,231,393,241],"type":"text","angle":0,"index":7,"text":"last() 方法返回最后一条数据返回的数据是模型类的对象不能用索引下标[-1]，ORM 没有逆序索引。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"85a79d9f-aee4-4f8f-9c36-3f3dee819638","page_size":[595,841],"block_position":"38-7"},{"bbox":[95,246,306,256],"type":"text","angle":0,"index":8,"text":"books $=$ models.Book.objects.last() # 返回所有数据的最后一条数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"eb796864-79bc-4bb2-9acd-9b43f18c174a","page_size":[595,841],"block_position":"38-8"},{"bbox":[88,281,175,297],"type":"title","angle":0,"index":9,"text":"# 是否存在数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":38,"id":"6c9f76ca-725c-43f0-955b-b97d9c8efa75","page_size":[595,841],"block_position":"38-9"},{"bbox":[87,333,284,343],"type":"text","angle":0,"index":10,"text":"exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"d593501d-ed45-4e9c-b18a-b8cbdfe7946d","page_size":[595,841],"block_position":"38-10"},{"bbox":[87,364,242,374],"type":"text","angle":0,"index":11,"text":"返回的数据类型是布尔，有为 true，没有为 false。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"f333b7b7-ceb0-4017-a065-93276cae6356","page_size":[595,841],"block_position":"38-11"},{"bbox":[87,395,336,405],"type":"text","angle":0,"index":12,"text":"注意：判断的数据类型只能为 QuerySet 类型数据，不能为整型和模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"82093571-1353-4cda-a94b-c43298d78028","page_size":[595,841],"block_position":"38-12"},{"bbox":[95,426,214,436],"type":"text","angle":0,"index":13,"text":"books $=$ models.Book.objects.exists()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"5246fc30-b27e-4ea3-a8ab-a38bf94ae98f","page_size":[595,841],"block_position":"38-13"},{"bbox":[95,442,298,452],"type":"text","angle":0,"index":14,"text":"# 报错，判断的数据类型只能为QuerySet类型数据，不能为整型","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"700ff04c-03b4-431b-a050-9b6601aafde0","page_size":[595,841],"block_position":"38-14"},{"bbox":[95,457,238,467],"type":"text","angle":0,"index":15,"text":"books $=$ models.Book.objects.count().exists()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"54aba4b2-2b3e-459b-8934-252fd05b95e9","page_size":[595,841],"block_position":"38-15"},{"bbox":[95,473,318,483],"type":"text","angle":0,"index":16,"text":"# 报错，判断的数据类型只能为QuerySet类型数据，不能为模型类对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"6717e183-9535-4cbe-9de1-1f5a1228f8ff","page_size":[595,841],"block_position":"38-16"},{"bbox":[95,489,232,498],"type":"text","angle":0,"index":17,"text":"books $=$ models.Book.objects.first().exists()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"8846de98-449d-45e7-bb24-0a388f75d953","page_size":[595,841],"block_position":"38-17"},{"bbox":[88,523,147,539],"type":"title","angle":0,"index":18,"text":"# 查询数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":38,"id":"f284a535-fb44-4d7b-ac23-e7820026457a","page_size":[595,841],"block_position":"38-18"},{"bbox":[87,576,211,585],"type":"text","angle":0,"index":19,"text":"values() 方法用于查询部分字段的数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"fa9c6bef-74cc-4b02-92af-d56fa8398e30","page_size":[595,841],"block_position":"38-19"},{"bbox":[86,606,486,616],"type":"text","angle":0,"index":20,"text":"返回的是 QuerySet 类型数据，类似于 list，里面不是模型类的对象，而是一个可迭代的字典序列，字典里的键是字段，值是数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"1d747abe-411e-4fbe-be10-2bde7d021b49","page_size":[595,841],"block_position":"38-20"},{"bbox":[88,638,107,647],"type":"text","angle":0,"index":21,"text":"注意：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"db31577f-cf42-42ee-9e08-3ed95a477a9d","page_size":[595,841],"block_position":"38-21"},{"bbox":[88,669,160,678],"type":"text","angle":0,"index":22,"text":"参数的字段名要加引号","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"2e2798af-a857-4a8b-87ce-ab6158837934","page_size":[595,841],"block_position":"38-22"},{"bbox":[88,685,175,694],"type":"text","angle":0,"index":23,"text":"想要字段名和数据用 values","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"a57a9ed7-c530-4965-9b71-0baeb18048d4","page_size":[595,841],"block_position":"38-23"},{"bbox":[95,700,250,709],"type":"text","angle":0,"index":24,"text":"books $=$ models.Book.objects.values(\"pk\",\"price\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"f42338b1-89d6-4669-b63d-64abf38f7859","page_size":[595,841],"block_position":"38-24"},{"bbox":[95,716,336,725],"type":"text","angle":0,"index":25,"text":"print(books[0][\"price\"],type(books)) # 得到的是第一条记录的 price 字段的数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":38,"id":"e0362c31-3830-42c2-be16-03835314b738","page_size":[595,841],"block_position":"38-25"}],[{"bbox":[88,85,158,101],"type":"title","angle":0,"index":0,"text":"# 查询数据 2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":39,"id":"8833898f-f40a-44fb-a01f-4297df5f6596","page_size":[595,841],"block_position":"39-0"},{"bbox":[86,137,227,147],"type":"text","angle":0,"index":1,"text":"values_list() 方法用于查询部分字段的数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"6b61e4c1-85f4-4153-adc9-9a9c3ff3e803","page_size":[595,841],"block_position":"39-1"},{"bbox":[86,153,465,163],"type":"text","angle":0,"index":2,"text":"返回的是 QuerySet 类型数据，类似于 list，里面不是模型类的对象，而是一个个元组，元组里放的是查询字段对应的数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"ff287848-8454-4c1f-852a-7c06389e5a69","page_size":[595,841],"block_position":"39-2"},{"bbox":[87,168,108,178],"type":"text","angle":0,"index":3,"text":"注意：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"d3b880db-67d9-44f7-8682-e232d48701c4","page_size":[595,841],"block_position":"39-3"},{"bbox":[105,184,196,193],"type":"text","angle":0,"index":4,"text":"参数的字段名要加引号","id":"34210abc-e1f3-4bdb-be99-4e8da36d6a5e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"page_size":[595,841],"block_position":"39-4"},{"bbox":[105,200,202,208],"type":"text","angle":0,"index":5,"text":". 只想要数据用 values_list","id":"afa65cf5-eb82-43c6-95d5-5066e7c3282b","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"page_size":[595,841],"block_position":"39-5"},{"bbox":[95,215,277,224],"type":"text","angle":0,"index":7,"text":"books $=$ models.Book.objects.values_list(\"price\",\"publish\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"541ad352-05dc-4a17-88eb-d1b0b481bd1e","page_size":[595,841],"block_position":"39-6"},{"bbox":[95,231,136,240],"type":"text","angle":0,"index":8,"text":"print(books)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"1f20afb6-6422-4d37-9f75-2209044a9f1c","page_size":[595,841],"block_position":"39-7"},{"bbox":[95,246,321,256],"type":"text","angle":0,"index":9,"text":"print(books[0][0],type(books)) # 得到的是第一条记录的 price 字段的数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"af0e17d3-5039-472f-a449-e4e771699616","page_size":[595,841],"block_position":"39-8"},{"bbox":[88,281,119,296],"type":"title","angle":0,"index":10,"text":"# 去重","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":39,"id":"87ddff5f-4177-4032-8e50-2018d2625c48","page_size":[595,841],"block_position":"39-9"},{"bbox":[86,333,202,343],"type":"text","angle":0,"index":11,"text":"distinct() 方法用于对数据进行去重。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"aa907b9e-cdf5-445d-92a4-ad61c55c347b","page_size":[595,841],"block_position":"39-10"},{"bbox":[87,349,183,358],"type":"text","angle":0,"index":12,"text":"返回的是 QuerySet 类型数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"c31cff8f-3065-4758-9268-cc84473008b4","page_size":[595,841],"block_position":"39-11"},{"bbox":[87,364,108,374],"type":"text","angle":0,"index":13,"text":"注意：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"eed19953-f808-4332-88ba-291ef7f58ddb","page_size":[595,841],"block_position":"39-12"},{"bbox":[105,380,339,389],"type":"text","angle":0,"index":14,"text":". 对模型类的对象去重没有意义，因为每个对象都是一个不一样的存在。","id":"7c779a82-c341-44f7-94a7-772ba4516de7","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"page_size":[595,841],"block_position":"39-13"},{"bbox":[105,395,280,405],"type":"text","angle":0,"index":15,"text":"distinct() 一般是联合 values 或者 values_list 使用。","id":"dad9f5d5-8170-48d8-9e11-b0420cae6be4","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"page_size":[595,841],"block_position":"39-14"},{"bbox":[87,426,163,436],"type":"text","angle":0,"index":17,"text":"def add_book(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"c7421444-2c41-46fc-9396-1acdf3d90f8b","page_size":[595,841],"block_position":"39-15"},{"bbox":[95,442,181,451],"type":"text","angle":0,"index":18,"text":"# 查询一共有多少个出版社","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"00c4d187-0a30-4961-9c15-8751028ba0dd","page_size":[595,841],"block_position":"39-16"},{"bbox":[94,457,504,467],"type":"text","angle":0,"index":19,"text":"books $=$ models.Book.objects.values_list(\"publish\").distinct() # 对模型类的对象去重没有意义，因为每个对象都是一个不一样的存在。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"227a8209-275c-4e77-843b-e9ba46e525c6","page_size":[595,841],"block_position":"39-17"},{"bbox":[95,473,218,482],"type":"text","angle":0,"index":20,"text":"books $=$ models.Book.objects.distinct()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"17278792-9041-4af7-b195-0f9f06c15b14","page_size":[595,841],"block_position":"39-18"},{"bbox":[87,507,245,524],"type":"title","angle":0,"index":21,"text":"# 基于双下划线的模糊查询","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":39,"id":"dacee6c6-71a2-4614-abfa-79b82e582f05","page_size":[595,841],"block_position":"39-19"},{"bbox":[86,560,183,569],"type":"text","angle":0,"index":22,"text":"filter() 方法（exclude 同理）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"fc03ba89-e026-40b3-a68f-1f61fd967af2","page_size":[595,841],"block_position":"39-20"},{"bbox":[86,575,368,585],"type":"text","angle":0,"index":23,"text":"注意：filter 中运算符号只能使用等于号 $=$ ，不能使用大于号 $>$ ，小于号 $<$ ，等等其他符号。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"2c682c94-ff63-4006-82d2-386fc92aa972","page_size":[595,841],"block_position":"39-21"},{"bbox":[87,591,207,600],"type":"text","angle":0,"index":24,"text":"_in 用于读取区间， $=$ 号后面为列表 。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"cf0220ae-43d4-4e4a-a4bb-4e6d6d3d704a","page_size":[595,841],"block_position":"39-22"},{"bbox":[87,606,330,617],"type":"text","angle":0,"index":25,"text":"_gt 大于号 ， $=$ 号后面为数字。__gte 大于等于， $=$ 号后面为数字。__lt,__lte","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"373b6bb8-7d1c-4e43-a7e0-2f50e3e81ae1","page_size":[595,841],"block_position":"39-23"},{"bbox":[87,622,291,632],"type":"text","angle":0,"index":26,"text":"_range 在 ... 之间，左闭右闭区间， $=$ 号后面为两个元素的列表。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"a04f74d6-dce9-4c39-9c98-a3f03453c04d","page_size":[595,841],"block_position":"39-24"},{"bbox":[87,638,207,647],"type":"text","angle":0,"index":27,"text":"_contains 包含， $=$ 号后面为字符串。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"bf629a98-94e9-48d3-9194-e436a4b71e97","page_size":[595,841],"block_position":"39-25"},{"bbox":[87,653,258,663],"type":"text","angle":0,"index":28,"text":"_icontains 不区分大小写的包含， $=$ 号后面为字符串。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"ba23eaf6-3a86-4287-9865-cf3b7c2cfdab","page_size":[595,841],"block_position":"39-26"},{"bbox":[87,669,246,678],"type":"text","angle":0,"index":29,"text":"_startswith 以指定字符开头， $=$ 号后面为字符串。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"628f65fd-494f-4af2-a893-717d6a0aa333","page_size":[595,841],"block_position":"39-27"},{"bbox":[87,684,244,694],"type":"text","angle":0,"index":30,"text":"_endswith 以指定字符结尾， $=$ 号后面为字符串。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"912f3177-620d-4420-8187-7d91406bd3c6","page_size":[595,841],"block_position":"39-28"},{"bbox":[87,700,314,710],"type":"text","angle":0,"index":31,"text":"_year 是 DateField 数据类型的年份， $=$ 号后面为数字。__day/__month","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":39,"id":"2bc0c575-8672-4922-8ab1-0d713ac3d718","page_size":[595,841],"block_position":"39-29"}],[{"bbox":[88,85,119,101],"type":"title","angle":0,"index":0,"text":"# 删除","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":40,"id":"ae4e6f6b-5962-4ad2-93a9-d2012a1f2b96","page_size":[595,841],"block_position":"40-0"},{"bbox":[86,137,205,147],"type":"text","angle":0,"index":1,"text":"方式一：使用模型类的 对象.delete()。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"42321952-a620-4f7c-9432-fee447b40003","page_size":[595,841],"block_position":"40-1"},{"bbox":[87,153,226,162],"type":"text","angle":0,"index":2,"text":"返回值：元组，第一个元素为受影响的行数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"9d58a357-bd14-4fcd-8ff1-f6d896b4ff2a","page_size":[595,841],"block_position":"40-2"},{"bbox":[87,168,255,178],"type":"text","angle":0,"index":3,"text":"books=models.Book.objects.filter(pk=8).first().delete()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"79ffb839-19c8-4050-a14f-8c134a3cff93","page_size":[595,841],"block_position":"40-3"},{"bbox":[87,184,239,194],"type":"text","angle":0,"index":4,"text":"方式二：使用 QuerySet 类型数据.delete()(推荐)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"6794a197-e14e-4be9-9f77-d5ffd1e07f54","page_size":[595,841],"block_position":"40-4"},{"bbox":[87,200,226,209],"type":"text","angle":0,"index":5,"text":"返回值：元组，第一个元素为受影响的行数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"e0dc813b-fc04-4563-8b13-f00787823422","page_size":[595,841],"block_position":"40-5"},{"bbox":[87,215,261,225],"type":"text","angle":0,"index":6,"text":"books=models.Book.objects.filter(pk__in=[1,2]).delete()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"aebc2359-0c2c-4dbd-8d9a-4f8ad371d275","page_size":[595,841],"block_position":"40-6"},{"bbox":[104,231,503,256],"type":"text","angle":0,"index":7,"text":"a. Django 删除数据时，会模仿 SQL约束 ON DELETE CASCADE 的行为，也就是删除一个对象时也会删除与它相关联的外键对象。","id":"e13b522a-e9cc-41ff-80ff-987886f3695e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"page_size":[595,841],"block_position":"40-7"},{"bbox":[104,262,487,272],"type":"text","angle":0,"index":8,"text":". b. delete() 方法是 QuerySet 数据类型的方法，但并不适用于 Manager 本身。也就是想要删除所有数据，不能不写 all。","id":"a0804b2c-df2f-4161-9b8e-4a1e7c57c64d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"page_size":[595,841],"block_position":"40-8"},{"bbox":[87,278,231,287],"type":"text","angle":0,"index":10,"text":"books=models.Book.objects.delete() # 报错","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"1a2795f4-8899-4a44-9636-00319b3a2b0c","page_size":[595,841],"block_position":"40-9"},{"bbox":[87,293,266,303],"type":"text","angle":0,"index":11,"text":"books=models.Book.objects.all().delete() # 删除成功","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"f0edc383-a3b6-461e-a78b-afa4c312d214","page_size":[595,841],"block_position":"40-10"},{"bbox":[87,327,119,343],"type":"title","angle":0,"index":12,"text":"# 修改","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":40,"id":"870e7ff0-d2f4-4b21-b38d-8ff8736605b1","page_size":[595,841],"block_position":"40-11"},{"bbox":[87,380,114,389],"type":"text","angle":0,"index":13,"text":"方式一：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"e431d08a-4e23-4c6a-9010-1a34900dabd5","page_size":[595,841],"block_position":"40-12"},{"bbox":[87,413,306,431],"type":"title","angle":0,"index":14,"text":"# 模型类的对象.属性 $=$ 更改的属性值","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":40,"id":"92a97fad-b570-4ffd-bd94-5633e532c677","page_size":[595,841],"block_position":"40-13"},{"bbox":[87,466,154,476],"type":"text","angle":0,"index":15,"text":"模型类的对象.save()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"4917096d-2c2f-46a0-8d51-b2fbc6452a90","page_size":[595,841],"block_position":"40-14"},{"bbox":[87,482,184,491],"type":"text","angle":0,"index":16,"text":"返回值：编辑的模型类的对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"26e27929-ceb9-4b7f-b21f-820faae81d0a","page_size":[595,841],"block_position":"40-15"},{"bbox":[87,497,234,507],"type":"interline_equation","angle":0,"index":17,"text":"$$\n\\text {b o o k s} = \\text {m o d e l s . B o o k . o b j e c t s . f i l t e r} (\\mathrm {p k} = 7). \\text {f i r s t ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":40,"id":"6ea3021f-3d3d-45a4-b7f5-dd57929d91de","page_size":[595,841],"block_position":"40-16"},{"bbox":[87,513,145,522],"type":"interline_equation","angle":0,"index":18,"text":"$$\n\\text {b o o k s . p r i c e} = 4 0 0\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":40,"id":"75ce296d-bf7d-4fab-ba00-5374e7016799","page_size":[595,841],"block_position":"40-17"},{"bbox":[87,528,130,538],"type":"interline_equation","angle":0,"index":19,"text":"$$\n\\mathsf {b o o k s . s a v e ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":40,"id":"363ac7e2-1f41-4d5a-ac48-13f31585d5b4","page_size":[595,841],"block_position":"40-18"},{"bbox":[87,544,289,554],"type":"text","angle":0,"index":20,"text":"方式二：QuerySet 类型数据.update(字段名 $\\mathbf { \\tau } = \\mathbf { \\dot { \\tau } }$ 更改的数据)（推荐）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"2892fd5c-cff8-451f-bcfd-a02911415315","page_size":[595,841],"block_position":"40-19"},{"bbox":[87,560,181,569],"type":"text","angle":0,"index":21,"text":"返回值：整数，受影响的行数","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"39eb849e-164e-4856-9fb7-560e2235c906","page_size":[595,841],"block_position":"40-20"},{"bbox":[88,576,104,585],"type":"text","angle":0,"index":22,"text":"实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"87bac248-c5e8-430c-8356-a3669fe501c8","page_size":[595,841],"block_position":"40-21"},{"bbox":[87,591,250,600],"type":"text","angle":0,"index":23,"text":"from django.shortcuts import render,HttpResponse","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"900e84e2-cefb-4ccd-b2fb-f9647936efe7","page_size":[595,841],"block_position":"40-22"},{"bbox":[87,606,175,615],"type":"text","angle":0,"index":24,"text":"from app01 import models","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"8c5ad77d-8628-4b6c-bcc2-67d3731b2963","page_size":[595,841],"block_position":"40-23"},{"bbox":[87,622,163,631],"type":"text","angle":0,"index":25,"text":"def add_book(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"73b4880a-4381-49f0-bef4-b15ac6b54be5","page_size":[595,841],"block_position":"40-24"},{"bbox":[95,638,306,647],"type":"text","angle":0,"index":26,"text":"books $=$ models.Book.objects.filter(pk__in=[7,8]).update(price=888)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"f54c5746-84b7-40f8-86db-2b99dc656851","page_size":[595,841],"block_position":"40-25"},{"bbox":[87,669,141,678],"type":"text","angle":0,"index":27,"text":"ORM - 添加数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"db24b4b7-07a7-442e-bf29-4898232eb3cd","page_size":[595,841],"block_position":"40-26"},{"bbox":[87,684,170,694],"type":"text","angle":0,"index":28,"text":"一对多(外键 ForeignKey)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"8f744478-6ff8-46e7-a6e9-6aaa210951ac","page_size":[595,841],"block_position":"40-27"},{"bbox":[87,700,279,709],"type":"text","angle":0,"index":29,"text":"方式一: 传对象的形式，返回值的数据类型是对象，书籍对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"8dfd9ccd-95e9-4971-8a01-ba86e4366c69","page_size":[595,841],"block_position":"40-28"},{"bbox":[87,716,107,724],"type":"text","angle":0,"index":30,"text":"步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"id":"456d2d92-3b98-44ed-a270-c9aa666b9e3e","page_size":[595,841],"block_position":"40-29"},{"bbox":[104,731,183,740],"type":"text","angle":0,"index":31,"text":"a. 获取出版社对象","id":"6b5cb809-8990-4f64-9130-6e071af4dab5","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"page_size":[595,841],"block_position":"40-30"},{"bbox":[104,746,260,756],"type":"text","angle":0,"index":32,"text":"b. 给书籍的出版社属性pulish 传出版社对象","id":"0ffb805b-4080-4904-a965-07b86d893e95","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":40,"page_size":[595,841],"block_position":"40-31"}],[{"bbox":[87,80,174,89],"type":"text","angle":0,"index":0,"text":"app01/views.py 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"e2c798a3-5ce1-4860-8ca4-c578e1ba5737","page_size":[595,841],"block_position":"41-0"},{"bbox":[87,95,163,105],"type":"text","angle":0,"index":1,"text":"def add_book(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"435a93d7-79ee-4a3d-8368-1f568d8a21de","page_size":[595,841],"block_position":"41-1"},{"bbox":[95,111,155,121],"type":"text","angle":0,"index":2,"text":"# 获取出版社对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"23e08f00-6043-4ed8-8761-acfbd5c5acb8","page_size":[595,841],"block_position":"41-2"},{"bbox":[95,127,255,137],"type":"text","angle":0,"index":3,"text":"pub_ob $=$ models.Publish.objects.filter(pk=1).first()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"d1ef08c3-1543-4c0e-839d-06df2826c3ed","page_size":[595,841],"block_position":"41-3"},{"bbox":[95,142,236,153],"type":"text","angle":0,"index":4,"text":"# 给书籍的出版社属性publish传出版社对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"3f912f45-bb4d-45a2-82df-62cd36dc253f","page_size":[595,841],"block_position":"41-4"},{"bbox":[95,158,427,169],"type":"text","angle":0,"index":5,"text":"book $=$ models.Book.objects.create(title=\"菜鸟教程\", price $\\scriptstyle \\sum 0 0$ , pub_date $\\cdot = \"$ 2010-10-10\", publish=pub_obj)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"e2174913-98ec-45b6-8b4b-017ce5fab204","page_size":[595,841],"block_position":"41-5"},{"bbox":[95,174,170,184],"type":"text","angle":0,"index":6,"text":"print(book, type(book))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"59061a53-cb2c-4ae5-81e2-fa8e5a741def","page_size":[595,841],"block_position":"41-6"},{"bbox":[95,190,184,199],"type":"text","angle":0,"index":7,"text":"return HttpResponse(book)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"3f76bc25-5e6f-40f5-9729-76eff2d6acef","page_size":[595,841],"block_position":"41-7"},{"bbox":[87,205,331,215],"type":"text","angle":0,"index":8,"text":"方式二: 传对象 id 的形式(由于传过来的数据一般是 id,所以传对象 id 是常用的)。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"13f78a41-67d8-44a8-8275-e227b8d75dd5","page_size":[595,841],"block_position":"41-8"},{"bbox":[87,221,351,230],"type":"text","angle":0,"index":9,"text":"一对多中，设置外键属性的类(多的表)中，MySQL 中显示的字段名是:外键属性名_id。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"e609b985-ff2c-4700-b241-29ff887f9c03","page_size":[595,841],"block_position":"41-9"},{"bbox":[87,236,205,245],"type":"text","angle":0,"index":10,"text":"返回值的数据类型是对象，书籍对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"df0244ee-cc8e-4bb0-86ce-6e8f354db189","page_size":[595,841],"block_position":"41-10"},{"bbox":[87,252,107,261],"type":"title","angle":0,"index":11,"text":"# 步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"3788b1bb-d4ce-44cd-a82d-a5742cec6a44","page_size":[595,841],"block_position":"41-11"},{"bbox":[105,267,196,276],"type":"text","angle":0,"index":12,"text":". a. 获取出版社对象的 id","id":"f41d0d3e-f23d-4830-bf09-4e41155cd971","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-12"},{"bbox":[105,283,298,292],"type":"text","angle":0,"index":13,"text":"b. 给书籍的关联出版社字段pulish_id 传出版社对象的 id","id":"4823424b-6344-46e0-a1d8-57f3698a7f25","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-13"},{"bbox":[87,298,267,308],"type":"title","angle":0,"index":15,"text":"# 多对多(ManyToManyField)：在第三张关系表中新增数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"2e92bd0d-f2e1-4e3b-b395-a88508b46e81","page_size":[595,841],"block_position":"41-14"},{"bbox":[87,314,188,323],"type":"text","angle":0,"index":16,"text":"方式一: 传对象形式，无返回值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"3cf1ef79-9aeb-4c0a-8204-fc1b57666a09","page_size":[595,841],"block_position":"41-15"},{"bbox":[87,330,107,338],"type":"title","angle":0,"index":17,"text":"# 步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"a767d7e4-3d79-456e-97cf-5418dfef8d66","page_size":[595,841],"block_position":"41-16"},{"bbox":[105,345,176,354],"type":"text","angle":0,"index":18,"text":"a. 获取作者对象","id":"e98ae39a-96bf-4211-ad32-c5b082c0cddc","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-17"},{"bbox":[105,361,176,370],"type":"text","angle":0,"index":19,"text":". b. 获取书籍对象","id":"d3aaef4f-c8f9-497d-affd-fdbfff2b72bd","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-18"},{"bbox":[105,376,287,386],"type":"text","angle":0,"index":20,"text":"c. 给书籍对象的 authors 属性用 add 方法传作者对象","id":"46613523-9e28-442d-a600-418e1a8ff8a9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-19"},{"bbox":[87,391,196,401],"type":"text","angle":0,"index":22,"text":"方式二: 传对象id形式，无返回值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"e39a4d58-8440-4fc3-a5e9-fbab2be3e911","page_size":[595,841],"block_position":"41-20"},{"bbox":[87,407,107,417],"type":"title","angle":0,"index":23,"text":"# 步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"21d026ff-ee4e-419d-a30e-2b0cc7466e5f","page_size":[595,841],"block_position":"41-21"},{"bbox":[105,423,190,432],"type":"text","angle":0,"index":24,"text":"a. 获取作者对象的 id","id":"4378d929-77e0-4c33-b4dc-7090610efff6","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-22"},{"bbox":[105,439,176,447],"type":"text","angle":0,"index":25,"text":". b. 获取书籍对象","id":"758e8fc1-ba01-444b-8491-e58e0b00d85d","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-23"},{"bbox":[105,454,301,464],"type":"text","angle":0,"index":26,"text":"c. 给书籍对象的 authors 属性用 add 方法传作者对象的 id","id":"788210a8-3ebd-4b10-81b1-bafa9f49e3e3","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-24"},{"bbox":[87,470,174,480],"type":"text","angle":0,"index":28,"text":"app01/views.py 文件代码：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"b2f0ac91-bca2-4911-a9ab-677e4e2611b7","page_size":[595,841],"block_position":"41-25"},{"bbox":[87,486,163,495],"type":"text","angle":0,"index":29,"text":"def add_book(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"e22acbba-4eab-48a9-896e-62f5bfb6d0da","page_size":[595,841],"block_position":"41-26"},{"bbox":[95,501,148,510],"type":"text","angle":0,"index":30,"text":"# 获取作者对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"727ddd28-f58e-4058-ab34-0c26e168ccac","page_size":[595,841],"block_position":"41-27"},{"bbox":[95,517,279,527],"type":"text","angle":0,"index":31,"text":"chong $=$ models.Author.objects.filter(name=\"令狐冲\").first()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"b4d263d6-e016-4ff1-b1bf-9ff46dd8c37b","page_size":[595,841],"block_position":"41-28"},{"bbox":[95,532,161,541],"type":"text","angle":0,"index":32,"text":"# 获取作者对象的id","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"5a464f59-5dae-4824-ad63-4416d8ba2d65","page_size":[595,841],"block_position":"41-29"},{"bbox":[95,548,142,556],"type":"text","angle":0,"index":33,"text":"pk $=$ chong.pk","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"92a3e9ad-e355-47e2-9381-60c7408e7ba9","page_size":[595,841],"block_position":"41-30"},{"bbox":[95,564,148,572],"type":"text","angle":0,"index":34,"text":"# 获取书籍对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"2e2d5c95-3423-4ae8-8148-99cd6023b3c7","page_size":[595,841],"block_position":"41-31"},{"bbox":[95,579,271,588],"type":"text","angle":0,"index":35,"text":"book $=$ models.Book.objects.filter(titl $\\mathrel { \\mathop : } \\mathbf { \\overline { { \\mathbf { \\Lambda } } } }$ \"冲灵剑法\").first()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"bbd40c15-7c5f-4fcb-a61f-a2e852cddc85","page_size":[595,841],"block_position":"41-32"},{"bbox":[95,594,273,603],"type":"text","angle":0,"index":36,"text":"# 给书籍对象的 authors 属性用 add 方法传作者对象的 id","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"3b5d1725-3c35-4f52-8655-51c1d8b64cbf","page_size":[595,841],"block_position":"41-33"},{"bbox":[95,610,164,619],"type":"text","angle":0,"index":37,"text":"book.authors.add(pk)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"6b448621-1225-41c0-9d74-597f3057a781","page_size":[595,841],"block_position":"41-34"},{"bbox":[87,626,158,635],"type":"title","angle":0,"index":38,"text":"# 关联管理器(对象调用)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"885f95db-fe40-4428-b7d9-db2d1898afd5","page_size":[595,841],"block_position":"41-35"},{"bbox":[87,641,107,650],"type":"title","angle":0,"index":39,"text":"# 前提：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"abeccb5e-5e02-46a1-9c78-ac1c8a7a5b21","page_size":[595,841],"block_position":"41-36"},{"bbox":[105,656,220,666],"type":"text","angle":0,"index":40,"text":"多对多（双向均有关联管理器）","id":"fd6aad07-d125-48be-9b13-7af674378892","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-37"},{"bbox":[105,672,311,682],"type":"text","angle":0,"index":41,"text":"一对多（只有多的那个类的对象有关联管理器，即反向才有）","id":"10c6d825-cb13-4f46-af29-e6630b67769c","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"page_size":[595,841],"block_position":"41-38"},{"bbox":[87,687,121,698],"type":"title","angle":0,"index":43,"text":"# 语法格式：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"af62cf58-673c-4017-81b3-6c896b95d5e5","page_size":[595,841],"block_position":"41-39"},{"bbox":[87,703,132,713],"type":"text","angle":0,"index":44,"text":"正向：属性名","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"e13055aa-8236-4be0-85a2-afca27419c50","page_size":[595,841],"block_position":"41-40"},{"bbox":[87,719,161,729],"type":"text","angle":0,"index":45,"text":"反向：小写类名加_set","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"ef169822-f890-4b6d-b8b0-099d4365f4f1","page_size":[595,841],"block_position":"41-41"},{"bbox":[87,735,160,744],"type":"text","angle":0,"index":46,"text":"注意：一对多只能反向","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":41,"id":"49d2c585-83da-4540-bdbe-d098b434f1e0","page_size":[595,841],"block_position":"41-42"},{"bbox":[87,751,121,760],"type":"title","angle":0,"index":47,"text":"# 常用方法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":41,"id":"52b96387-d398-4a6a-b696-72f847e6f98e","page_size":[595,841],"block_position":"41-43"}],[{"bbox":[86,80,314,89],"type":"text","angle":0,"index":0,"text":"add()：用于多对多，把指定的模型对象添加到关联对象集（关系表）中。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"1bcde06a-f52b-4350-9879-0c35827e3f16","page_size":[595,841],"block_position":"42-0"},{"bbox":[86,95,381,105],"type":"text","angle":0,"index":1,"text":"注意：add() 在一对多(即外键)中，只能传对象（ *QuerySet数据类型），不能传 id（*[id表]）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"3217fdc3-2085-48ac-9bc9-06ccc907c65a","page_size":[595,841],"block_position":"42-1"},{"bbox":[87,112,124,121],"type":"text","angle":0,"index":2,"text":"*[ ] 的使用:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"d21ac1cb-8ca4-48da-8398-f037fbfeef99","page_size":[595,841],"block_position":"42-2"},{"bbox":[87,127,145,136],"type":"text","angle":0,"index":3,"text":"# 方式一：传对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"07937ed0-9f75-432b-8911-9a3810a59b83","page_size":[595,841],"block_position":"42-3"},{"bbox":[87,142,224,152],"type":"interline_equation","angle":0,"index":4,"text":"$$\n\\text {b o o k} \\_ \\text {o b j} = \\text {m o d e l s . B o o k . o b j e c t s . g e t (i d = 1 0)}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"aef44d6a-6d59-4b76-bc67-9d6b0621d9eb","page_size":[595,841],"block_position":"42-4"},{"bbox":[87,158,246,168],"type":"interline_equation","angle":0,"index":5,"text":"$$\n\\text {a u t o r} = \\text {m o d e l s . A u t o r . o b j e c t s . f i l t e r (i d \\_ g t = 2)}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"e88f3aa6-fc42-4a3c-a304-b50006930ad0","page_size":[595,841],"block_position":"42-5"},{"bbox":[86,174,362,184],"type":"text","angle":0,"index":6,"text":"book_obj.authors.add(*author_list) # 将 id 大于 2 的作者对象添加到这本书的作者集合中","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"7d547942-51dd-44dc-b369-8185f0ee44bd","page_size":[595,841],"block_position":"42-6"},{"bbox":[87,190,152,198],"type":"text","angle":0,"index":7,"text":"# 方式二：传对象id","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"a197cbca-df34-4c19-87ca-6d381de69658","page_size":[595,841],"block_position":"42-7"},{"bbox":[86,205,352,215],"type":"text","angle":0,"index":8,"text":"book_obj.authors.add(*[1,3]) # 将 id=1 和 id=3 的作者对象添加到这本书的作者集合中","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"e460cd12-3632-47ff-b005-d3769ee53b6c","page_size":[595,841],"block_position":"42-8"},{"bbox":[87,221,174,230],"type":"text","angle":0,"index":9,"text":"return HttpResponse(\"ok\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"fea35e5b-9af3-4267-8f49-9eb891c723a2","page_size":[595,841],"block_position":"42-9"},{"bbox":[87,236,154,246],"type":"text","angle":0,"index":10,"text":"反向：小写表名_set","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"065831be-f5bb-4b04-b5d9-21ad8c7c764c","page_size":[595,841],"block_position":"42-10"},{"bbox":[87,252,265,262],"type":"interline_equation","angle":0,"index":11,"text":"$$\ny i n g = \\text {m o d e l s . A u t h o r . o b j e c t s . f i l t e r} (\\text {n a m e} = ^ {\\prime \\prime} \\text {任 盈 盈} ^ {\\prime \\prime}). \\text {f i r s t ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"7fe7f886-670d-4601-9ce9-4435cac5135a","page_size":[595,841],"block_position":"42-11"},{"bbox":[87,267,263,277],"type":"interline_equation","angle":0,"index":12,"text":"$$\n\\text {b o o k} = \\text {m o d e l s . B o o k . o b j e c t s . f i l t e r (t i t l e = ＂ 冲 灵 剑 法 ＂) . f i r s t ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"32ebba28-fa4d-4ac3-ae58-56fb9bbc90f4","page_size":[595,841],"block_position":"42-12"},{"bbox":[87,283,167,292],"type":"interline_equation","angle":0,"index":13,"text":"$$\n\\text {y i n g . b o o k \\_ s e t . a d d (b o o k)}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"93faa705-db7e-43a7-aa7f-d1b5693ce46a","page_size":[595,841],"block_position":"42-13"},{"bbox":[87,314,186,324],"type":"title","angle":0,"index":14,"text":"# 1. 正向查询（Forward Query）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"0c0da9cf-6334-490a-a432-f5a4a73ba04c","page_size":[595,841],"block_position":"42-14"},{"bbox":[87,330,105,338],"type":"title","angle":0,"index":15,"text":"# 定义","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"0a7229bf-aafb-40e4-be18-70a8adae19cb","page_size":[595,841],"block_position":"42-15"},{"bbox":[105,344,273,354],"type":"text","angle":0,"index":16,"text":"从“持有外键的模型”访问“被关联的模型”。","id":"0c646f48-e9dc-4ce6-9613-4f8a38423d97","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"page_size":[595,841],"block_position":"42-16"},{"bbox":[105,360,223,370],"type":"text","angle":0,"index":17,"text":"使用属性名直接访问关联对象。","id":"93728fff-1a77-4731-9adb-0a3cf617c8a2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"page_size":[595,841],"block_position":"42-17"},{"bbox":[87,376,186,386],"type":"title","angle":0,"index":19,"text":"# 2. 反向查询（Reverse Query）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"e82995ab-154a-406c-bd77-38c5b636f609","page_size":[595,841],"block_position":"42-18"},{"bbox":[87,392,104,401],"type":"title","angle":0,"index":20,"text":"# 定义","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"ff9850e7-6391-4210-8efb-4c14ffe978f7","page_size":[595,841],"block_position":"42-19"},{"bbox":[105,407,273,417],"type":"text","angle":0,"index":21,"text":"从“被关联的模型”访问“持有外键的模型”。","id":"76076e7d-3f0f-49f3-bd35-bde21797532f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"page_size":[595,841],"block_position":"42-20"},{"bbox":[105,423,265,433],"type":"text","angle":0,"index":22,"text":"默认使用小写类名_set 作为关联管理器名称。","id":"870127b1-3b5f-4429-859d-532606333373","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"page_size":[595,841],"block_position":"42-21"},{"bbox":[87,439,241,449],"type":"text","angle":0,"index":24,"text":"remove()：从关联对象集中移除执行的模型对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"7e7be8ce-1a64-4c25-aeeb-1c8239052b75","page_size":[595,841],"block_position":"42-22"},{"bbox":[86,454,337,464],"type":"text","angle":0,"index":25,"text":"对于 ForeignKey 对象，这个方法仅在 null=True（可以为空）时存在，无返回值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"c848df05-0a5b-4a0c-859f-a553e3d9a70b","page_size":[595,841],"block_position":"42-23"},{"bbox":[87,470,104,479],"type":"title","angle":0,"index":26,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"84f5e5d2-13dc-4157-8c87-e1147d7ec921","page_size":[595,841],"block_position":"42-24"},{"bbox":[87,486,227,495],"type":"interline_equation","angle":0,"index":27,"text":"$$\n\\text {a u t o r} = \\text {m o d e l s . A u t h o r . o b j e c t s . g e t (i d = 1)}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"4e3ae25a-9f40-460a-bfa6-c2f05757fdce","page_size":[595,841],"block_position":"42-25"},{"bbox":[87,501,224,510],"type":"interline_equation","angle":0,"index":28,"text":"$$\n\\text {b o o k} \\_ \\text {o b j} = \\text {m o d e l s . B o o k . o b j e c t s . g e t (i d = 1 1)}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"57bfd91a-6f09-4a4a-b207-354930d786fc","page_size":[595,841],"block_position":"42-26"},{"bbox":[87,517,212,526],"type":"interline_equation","angle":0,"index":29,"text":"$$\n\\text {a t h o r} \\quad \\text {o b j . b o o k} \\quad \\text {s e t . r e m o v e} (\\text {b o o k} \\quad \\text {o b j})\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"ff4407b4-aa77-47d9-ac90-3628062c8dcd","page_size":[595,841],"block_position":"42-27"},{"bbox":[87,532,296,542],"type":"text","angle":0,"index":30,"text":"clear()：从关联对象集中移除一切对象，删除关联，不会删除对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"9c66560b-b3c0-464f-858a-feeceed8a372","page_size":[595,841],"block_position":"42-28"},{"bbox":[87,548,303,557],"type":"text","angle":0,"index":31,"text":"对于 ForeignKey 对象，这个方法仅在 null=True（可以为空）时存在。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"663b9fc9-4119-4bf2-9e05-3462d6eab6fc","page_size":[595,841],"block_position":"42-29"},{"bbox":[87,564,121,572],"type":"text","angle":0,"index":32,"text":"无返回值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"50ae00ca-be49-4d5c-8701-d515b8cf152c","page_size":[595,841],"block_position":"42-30"},{"bbox":[87,579,189,588],"type":"text","angle":0,"index":33,"text":"# 清空独孤九剑关联的所有作者","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"63c76e7f-ba3a-485b-98e5-f7fe254711c4","page_size":[595,841],"block_position":"42-31"},{"bbox":[87,595,263,604],"type":"interline_equation","angle":0,"index":34,"text":"$$\n\\text {b o o k} = \\text {m o d e l s . B o o k . o b j e c t s . f i l t e r (t i t l e} = \\text {＂ 菜 鸟 教 程 ＂) . f i r s t ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"902a3145-2ca4-4e21-9199-51480f3d476f","page_size":[595,841],"block_position":"42-32"},{"bbox":[87,610,152,619],"type":"interline_equation","angle":0,"index":35,"text":"$$\n\\text {b o o k . a u t h o r s . c l e a r ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"6cdc0571-0a49-4b28-b4c7-aa473bc9dc5d","page_size":[595,841],"block_position":"42-33"},{"bbox":[87,626,122,634],"type":"title","angle":0,"index":36,"text":"# ORM 查询","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"47e92098-1f2d-47df-ae6f-bd3ef7d89e91","page_size":[595,841],"block_position":"42-34"},{"bbox":[87,641,156,650],"type":"text","angle":0,"index":37,"text":"基于对象的跨表查询。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"e6ed41d4-07f3-41c8-bb77-a8640e403f6f","page_size":[595,841],"block_position":"42-35"},{"bbox":[87,657,139,666],"type":"text","angle":0,"index":38,"text":"正向：属性名称","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"c21448a6-8ecc-4894-b06b-46f4cab082b8","page_size":[595,841],"block_position":"42-36"},{"bbox":[87,672,152,682],"type":"text","angle":0,"index":39,"text":"反向：小写类名_set","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"bd78c323-f182-45ad-84e8-c72fc7f9aa6f","page_size":[595,841],"block_position":"42-37"},{"bbox":[87,688,111,698],"type":"title","angle":0,"index":40,"text":"# 一对多","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"1f081c33-50aa-41f3-8275-7749262d3867","page_size":[595,841],"block_position":"42-38"},{"bbox":[87,703,247,713],"type":"text","angle":0,"index":41,"text":"查询主键为 1 的书籍的出版社所在的城市（正向）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":42,"id":"92ce93fb-c483-41ce-b5c1-e72f8d29b916","page_size":[595,841],"block_position":"42-39"},{"bbox":[87,719,104,729],"type":"title","angle":0,"index":42,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":42,"id":"0bde5aeb-17d1-44d1-93e2-8447a3970c28","page_size":[595,841],"block_position":"42-40"},{"bbox":[87,735,235,760],"type":"interline_equation","angle":0,"index":43,"text":"$$\n\\begin{array}{l} \\text {b o o k} = \\text {m o d e l s . B o o k . o b j e c t s . f i l t e r (p k = 1 0) . f i r s t ()} \\\\ \\mathrm {r e s} = \\text {b o o k . p u b l i s h . c i t y} \\\\ \\end{array}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":42,"id":"435c5114-8d42-4ea8-b94c-31c8befcdcd3","page_size":[595,841],"block_position":"42-41"}],[{"bbox":[87,80,211,89],"type":"text","angle":0,"index":0,"text":"查询明教出版社出版的书籍名（反向）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"ff667fdd-cec8-41aa-813c-23621cff46ab","page_size":[595,841],"block_position":"43-0"},{"bbox":[87,95,312,105],"type":"text","angle":0,"index":1,"text":"反向：对象.小写类名_set(pub.book_set) 可以跳转到关联的表(书籍表)。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"9687b1c6-0c1f-4113-974e-5874ee6a4132","page_size":[595,841],"block_position":"43-1"},{"bbox":[87,111,395,121],"type":"text","angle":0,"index":2,"text":"pub.book_set.all()：取出书籍表的所有书籍对象，在一个 QuerySet 里，遍历取出一个个书籍对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"358bd043-21b9-4b3d-b5ed-1a41bbe9e920","page_size":[595,841],"block_position":"43-2"},{"bbox":[88,127,104,136],"type":"title","angle":0,"index":3,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"95d6024e-5d2e-4f85-9d3a-5df08a502d1d","page_size":[595,841],"block_position":"43-3"},{"bbox":[87,142,280,198],"type":"interline_equation","angle":0,"index":4,"text":"$$\n\\begin{array}{l} \\mathrm {p u b} = \\text {m o d e l s . P u b l i s h . o b j e c t s . f i l t e r (n a m e = \" 明 教 出 版 社\")}. \\text {f i r s t ()} \\\\ \\operatorname {r e s} = \\operatorname {p u b}. \\operatorname {b o o k} _ {\\text {s e t}}. \\operatorname {a l l} () \\\\ f o r i \\text {i n} \\\\ \\mathbf {p r i n t} (i. t i l e) \\\\ \\end{array}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"eab4bdbe-aafe-4387-9d3f-b096ee24b9ff","page_size":[595,841],"block_position":"43-4"},{"bbox":[88,206,111,214],"type":"title","angle":0,"index":5,"text":"# 一对一","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"ce97b6d4-24f5-4653-86be-742ddeed7b97","page_size":[595,841],"block_position":"43-5"},{"bbox":[87,220,169,229],"type":"text","angle":0,"index":6,"text":"查询令狐冲的电话（正向）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"25eebc65-6810-4dbd-8b70-18ec6d41406d","page_size":[595,841],"block_position":"43-6"},{"bbox":[87,236,301,246],"type":"text","angle":0,"index":7,"text":"正向：对象.属性 (author.au_detail) 可以跳转到关联的表(作者详情表)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"023f5c45-3462-4181-ac95-117f0bac7af9","page_size":[595,841],"block_position":"43-7"},{"bbox":[88,252,104,260],"type":"title","angle":0,"index":8,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"b1faf8d2-6d94-448a-ba44-3197ec148747","page_size":[595,841],"block_position":"43-8"},{"bbox":[87,267,271,277],"type":"interline_equation","angle":0,"index":9,"text":"$$\n\\text {a u t h o r} = \\text {m o d e l s . A u t h o r . o b j e c t s . f i l t e r (n a m e = \" 令 狐 冲\") . f i r s t ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"233ead80-bc10-41b2-9bfa-fb8d73ea53c7","page_size":[595,841],"block_position":"43-9"},{"bbox":[88,283,167,291],"type":"interline_equation","angle":0,"index":10,"text":"$$\n\\mathrm {r e s} = \\text {a u t h o r}.\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"10236b45-8b93-4e8d-98c7-53eae738364c","page_size":[595,841],"block_position":"43-10"},{"bbox":[88,299,151,308],"type":"interline_equation","angle":0,"index":11,"text":"$$\n\\operatorname {p r i n t} (\\text {r e s}, \\text {t y p e} (\\text {r e s}))\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"8e6b3db3-3ec6-4bad-b955-c3dde7e74f50","page_size":[595,841],"block_position":"43-11"},{"bbox":[87,314,232,323],"type":"text","angle":0,"index":12,"text":"查询所有住址在黑木崖的作者的姓名（反向）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"ab3551ce-7bdc-4f42-9d72-95152f042907","page_size":[595,841],"block_position":"43-12"},{"bbox":[87,329,252,339],"type":"text","angle":0,"index":13,"text":"一对一的反向，用对象.小写类名即可，不用加_set。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"de25ea9d-253d-4549-8dce-bf83fc91e383","page_size":[595,841],"block_position":"43-13"},{"bbox":[87,345,286,354],"type":"text","angle":0,"index":14,"text":"反向：对象.小写类名(addr.author)可以跳转到关联的表(作者表)。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"f3ad4f4f-737d-4e56-b819-cbe99208625a","page_size":[595,841],"block_position":"43-14"},{"bbox":[88,361,104,370],"type":"title","angle":0,"index":15,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"8107c49a-096f-4224-a4da-142198e8d449","page_size":[595,841],"block_position":"43-15"},{"bbox":[87,376,280,417],"type":"interline_equation","angle":0,"index":16,"text":"$$\n\\begin{array}{l} \\text {a d d r} = \\text {m o d e l s . A u t h o r D e a t i l . o b j e c t s . f i l t e r} (\\text {a d d r} = ^ {\\prime \\prime} \\text {黑 木 崖}) ^ {\\prime \\prime}). \\text {f i r s t} () \\\\ \\text {r e s} = \\text {a d d r . a u t h o r . n a m e} \\\\ \\operatorname {p r i n t} (\\text {r e s}, \\text {t y p e} (\\text {r e s})) \\\\ \\end{array}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"cc265e83-28a2-4808-bcda-cea0cdc76a1b","page_size":[595,841],"block_position":"43-16"},{"bbox":[88,423,111,432],"type":"title","angle":0,"index":17,"text":"# 多对多","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"79b05b9e-2fa3-4363-b354-4e3bbd832684","page_size":[595,841],"block_position":"43-17"},{"bbox":[87,439,232,448],"type":"text","angle":0,"index":18,"text":"菜鸟教程所有作者的名字以及手机号（正向）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"fde7e113-33f0-4afe-b520-24fd81dc3bc1","page_size":[595,841],"block_position":"43-18"},{"bbox":[87,454,281,464],"type":"text","angle":0,"index":19,"text":"正向：对象.属性(book.authors)可以跳转到关联的表(作者表)。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"96df95b5-e71f-4f29-a52d-b0f865424754","page_size":[595,841],"block_position":"43-19"},{"bbox":[87,470,378,480],"type":"text","angle":0,"index":20,"text":"作者表里没有作者电话，因此再次通过对象.属性(i.au_detail)跳转到关联的表（作者详情表）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"74e53a7a-e16b-4ba9-addd-010a3ed5feb7","page_size":[595,841],"block_position":"43-20"},{"bbox":[88,486,104,495],"type":"title","angle":0,"index":21,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"e801e2d1-196d-4161-bb49-d37e06f615cc","page_size":[595,841],"block_position":"43-21"},{"bbox":[87,501,262,511],"type":"interline_equation","angle":0,"index":22,"text":"$$\n\\text {b o o k} = \\text {m o d e l s . B o o k . o b j e c t s . f i l t e r (t i t l e = \" 菜 鸟 教 程 ) . f i r s t ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"2e6c6364-d96d-4403-be62-a9648b5d22de","page_size":[595,841],"block_position":"43-22"},{"bbox":[88,517,161,526],"type":"interline_equation","angle":0,"index":23,"text":"$$\n\\mathrm {r e s} = \\text {b o o k . a u t h o r s . a l l ()}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"df15c640-8fa6-4011-8dcd-0096208162c4","page_size":[595,841],"block_position":"43-23"},{"bbox":[88,533,124,541],"type":"interline_equation","angle":0,"index":24,"text":"$$\nf o r i n \\text {r e s}:\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"badae037-1c27-4954-8aa3-4f790ffabd10","page_size":[595,841],"block_position":"43-24"},{"bbox":[96,548,184,557],"type":"interline_equation","angle":0,"index":25,"text":"$$\n\\text {p r i n t} (\\mathrm {i . n a m e}, \\mathrm {i . a u} _ {\\text {d e t a l}}. \\text {t e l})\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"81a4e4fc-5bab-4fb4-b4b7-04bcbdc99472","page_size":[595,841],"block_position":"43-25"},{"bbox":[87,563,226,573],"type":"text","angle":0,"index":26,"text":"查询任我行出过的所有书籍的名字（反向）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"6498a22f-731c-4fcd-a723-247ace81ce7d","page_size":[595,841],"block_position":"43-26"},{"bbox":[88,579,104,587],"type":"title","angle":0,"index":27,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"c4525044-02d5-4ebb-9122-e6bd44c40a52","page_size":[595,841],"block_position":"43-27"},{"bbox":[87,595,271,650],"type":"interline_equation","angle":0,"index":28,"text":"$$\n\\begin{array}{l} \\text {a u t h o r} = \\text {m o d e l s . A u t h o r . o b j e c t s . f i l t e r (n a m e} = ^ {\\prime \\prime} \\text {任 我 行}) ^ {\\prime \\prime}. \\text {f i r s t ()} \\\\ \\operatorname {r e s} = \\text {a u t h o r . b o o k \\_ s e t . a l l ()} \\\\ f o r i n \\text {r e s}: \\\\ \\mathbf {p r i n t} (i. t i l e) \\\\ \\end{array}\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"93e77216-3860-4103-92bf-5afc66a33dc5","page_size":[595,841],"block_position":"43-28"},{"bbox":[87,656,303,666],"type":"text","angle":0,"index":29,"text":"正向：属性名称__跨表的属性名称反向：小写类名__跨表的属性名称","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"ead6d700-84e6-45e3-8c98-c9d4a4396aba","page_size":[595,841],"block_position":"43-29"},{"bbox":[88,672,111,681],"type":"title","angle":0,"index":30,"text":"# 一对多","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"9b9355b4-8056-4218-b2f4-a7eac6da0e1c","page_size":[595,841],"block_position":"43-30"},{"bbox":[87,687,239,698],"type":"text","angle":0,"index":31,"text":"查询菜鸟出版社出版过的所有书籍的名字与价格。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"266dde2b-d5cf-4f80-87f4-1e6d3011e67f","page_size":[595,841],"block_position":"43-31"},{"bbox":[88,704,104,713],"type":"title","angle":0,"index":32,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"1674ede5-563d-4964-a28a-741ad2f08f56","page_size":[595,841],"block_position":"43-32"},{"bbox":[87,719,362,729],"type":"interline_equation","angle":0,"index":33,"text":"$$\n\\text {r e s} = \\text {m o d e l s . B o o k . o b j e c t s . f i l t e r (p u b l i s h \\_ n a m e = \" 菜 鸟 出 版 社\") . v a l u e s \\_ l i s t (\"} t h i t e , \" p r i c e \")\n$$","color":{"line":"rgba(230, 122, 171, 1)","fill":"rgba(230, 122, 171, 1)"},"page_idx":43,"id":"213c4f89-57b6-430b-b5a3-6cc9f658355c","page_size":[595,841],"block_position":"43-33"},{"bbox":[87,735,303,744],"type":"text","angle":0,"index":34,"text":"正向：属性名称__跨表的属性名称反向：小写类名__跨表的属性名称","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":43,"id":"002686c0-2c38-4f9b-a68a-386c4906a119","page_size":[595,841],"block_position":"43-34"},{"bbox":[88,751,111,760],"type":"title","angle":0,"index":35,"text":"# 一对多","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":43,"id":"1dc1f59a-6d78-4a32-9783-ec9525a3aa6a","page_size":[595,841],"block_position":"43-35"}],[{"bbox":[87,80,240,89],"type":"text","angle":0,"index":0,"text":"查询菜鸟出版社出版过的所有书籍的名字与价格。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"b92b8925-a100-4eeb-b9ae-aa237d1a58c4","page_size":[595,841],"block_position":"44-0"},{"bbox":[87,95,104,105],"type":"title","angle":0,"index":1,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"0311ee9c-78ed-4ca3-a084-d66867f7242a","page_size":[595,841],"block_position":"44-1"},{"bbox":[86,111,362,121],"type":"text","angle":0,"index":2,"text":"res $=$ models.Book.objects.filter(publish__name=\"菜鸟出版社\").values_list(\"title\", \"price\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"07725c53-d4ff-4ce2-9e0d-711cf643237c","page_size":[595,841],"block_position":"44-2"},{"bbox":[87,127,357,137],"type":"text","angle":0,"index":3,"text":"反向：通过 小写类名__跨表的属性名称（book__title，book__price）跨表获取数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"065928ee-d7ec-4ac8-87ee-4581002faa0e","page_size":[595,841],"block_position":"44-3"},{"bbox":[87,142,104,152],"type":"title","angle":0,"index":4,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"6eedf16a-8a57-4093-bb7b-ef5681d45f12","page_size":[595,841],"block_position":"44-4"},{"bbox":[86,158,383,168],"type":"text","angle":0,"index":5,"text":"res $=$ models.Publish.objects.filter(name=\"菜鸟出版社\").values_list(\"book__title\",\"book__price\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"b94faaa9-1d0a-425c-926b-afb1d0fd9033","page_size":[595,841],"block_position":"44-5"},{"bbox":[87,174,173,183],"type":"text","angle":0,"index":6,"text":"return HttpResponse(\"ok\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"b8e920bb-cec3-4098-8cb7-ee8fa765df50","page_size":[595,841],"block_position":"44-6"},{"bbox":[87,189,111,198],"type":"title","angle":0,"index":7,"text":"# 多对多","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"f02fb7ff-599e-49da-9752-33af7ef05c8f","page_size":[595,841],"block_position":"44-7"},{"bbox":[87,205,198,214],"type":"text","angle":0,"index":8,"text":"查询任我行出过的所有书籍的名字。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"d0c8b76c-6fdd-4fcc-b7d5-df2a5d4b754e","page_size":[595,841],"block_position":"44-8"},{"bbox":[87,220,312,230],"type":"text","angle":0,"index":9,"text":"正向：通过 属性名称__跨表的属性名称(authors__name) 跨表获取数据：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"d7f25927-2c11-4ede-a272-002040d771dc","page_size":[595,841],"block_position":"44-9"},{"bbox":[87,236,326,246],"type":"text","angle":0,"index":10,"text":"res $=$ models.Book.objects.filter(authors__name=\"任我行\").values_list(\"title\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"a55ac5c1-5668-45dc-abbe-e44d5bd7bfc2","page_size":[595,841],"block_position":"44-10"},{"bbox":[87,252,306,262],"type":"text","angle":0,"index":11,"text":"反向：通过 小写类名__跨表的属性名称（book__title） 跨表获取数据：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"df8d2922-e7d8-458b-be3b-aa1114b6ad9f","page_size":[595,841],"block_position":"44-11"},{"bbox":[87,267,322,277],"type":"text","angle":0,"index":12,"text":"res $=$ models.Author.objects.filter(name=\"任我行\").values_list(\"book__title\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"798cf493-3971-4106-8eb3-58844d6f48d0","page_size":[595,841],"block_position":"44-12"},{"bbox":[87,283,111,291],"type":"title","angle":0,"index":13,"text":"# 一对一","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"55eb6ae4-e29e-461a-84df-151db67cfb72","page_size":[595,841],"block_position":"44-13"},{"bbox":[87,298,155,307],"type":"text","angle":0,"index":14,"text":"查询任我行的手机号。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"54884f06-d06c-4c96-a7f5-0326864dd23e","page_size":[595,841],"block_position":"44-14"},{"bbox":[87,313,309,323],"type":"text","angle":0,"index":15,"text":"正向：通过属性名称__跨表的属性名称(au_detail__tel) 跨表获取数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"34e167a8-f17a-416e-881a-c7ce03847b7d","page_size":[595,841],"block_position":"44-15"},{"bbox":[87,329,332,339],"type":"text","angle":0,"index":16,"text":"res $=$ models.Author.objects.filter(name=\"任我行\").values_list(\"au_detail__tel\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"4b21d5f6-4247-4965-9f19-a7458a7057a3","page_size":[595,841],"block_position":"44-16"},{"bbox":[87,345,320,354],"type":"text","angle":0,"index":17,"text":"反向：通过小写类名__跨表的属性名称（author__name）跨表获取数据。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"9151d324-7785-4d16-8765-dfb14cab1101","page_size":[595,841],"block_position":"44-17"},{"bbox":[87,360,341,370],"type":"text","angle":0,"index":18,"text":"res $=$ models.AuthorDetail.objects.filter(author__name=\"任我行\").values_list(\"tel\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"5d370cdc-4e42-4279-91ab-d330ccb1beb0","page_size":[595,841],"block_position":"44-18"},{"bbox":[87,376,227,386],"type":"title","angle":0,"index":19,"text":"# Django ORM – 多表实例（聚合与分组查询）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"ae759916-d9a4-4a03-a5ef-4c41932b0d25","page_size":[595,841],"block_position":"44-19"},{"bbox":[87,391,161,401],"type":"title","angle":0,"index":20,"text":"# 聚合查询（aggregate）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"c4a75108-66ae-4cf2-b9df-f6f558159619","page_size":[595,841],"block_position":"44-20"},{"bbox":[87,407,246,417],"type":"text","angle":0,"index":21,"text":"聚合查询函数是对一组值执行计算，并返回单个值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"e3dd21cf-b349-4a01-9204-e57f6c556a66","page_size":[595,841],"block_position":"44-21"},{"bbox":[87,423,408,433],"type":"text","angle":0,"index":22,"text":"Django 使用聚合查询前要先从 django.db.models 引入 Avg、Max、Min、Count、Sum（首字母大写）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"ebd1ec38-0ed8-47c4-b8f1-a40377873e2e","page_size":[595,841],"block_position":"44-22"},{"bbox":[87,439,303,448],"type":"text","angle":0,"index":23,"text":"from django.db.models import Avg,Max,Min,Count,Sum # 引入函数","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"edc25b1d-3f8c-4c4d-a3f2-a7778431a58d","page_size":[595,841],"block_position":"44-23"},{"bbox":[87,454,198,464],"type":"text","angle":0,"index":24,"text":"聚合查询返回值的数据类型是字典。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"ee10a6c4-375f-4c43-a32c-f5b00eade1fd","page_size":[595,841],"block_position":"44-24"},{"bbox":[87,470,365,480],"type":"text","angle":0,"index":25,"text":"聚合函数 aggregate() 是 QuerySet 的一个终止子句， 生成的一个汇总值，相当于 count()。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"40d3d4af-5923-40b6-a68d-e1428200c98a","page_size":[595,841],"block_position":"44-25"},{"bbox":[87,485,369,495],"type":"text","angle":0,"index":26,"text":"使用 aggregate() 后，数据类型就变为字典，不能再使用 QuerySet 数据类型的一些 API 了。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"acb981a0-e051-44a2-bc2c-bc0a5a3053a3","page_size":[595,841],"block_position":"44-26"},{"bbox":[87,501,227,510],"type":"text","angle":0,"index":27,"text":"日期数据类型(DateField)可以用 Max 和 Min。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"8c7d352c-b7f7-4cf6-8481-4985aaab886e","page_size":[595,841],"block_position":"44-27"},{"bbox":[87,516,367,526],"type":"text","angle":0,"index":28,"text":"返回的字典中：键的名称默认是（属性名称加上__聚合函数名），值是计算出来的聚合值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"b6b14664-c519-472e-aa04-1f2daafee21a","page_size":[595,841],"block_position":"44-28"},{"bbox":[87,532,240,541],"type":"text","angle":0,"index":29,"text":"如果要自定义返回字典的键的名称，可以起别名：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"71f17c76-96b5-450f-a6af-b0156a64c2ef","page_size":[595,841],"block_position":"44-29"},{"bbox":[87,548,220,557],"type":"text","angle":0,"index":30,"text":"aggregate(别名 $=$ 聚合函数名(\"属性名称\"))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"24985fde-d46e-42d4-a0fa-74612a4865dd","page_size":[595,841],"block_position":"44-30"},{"bbox":[87,579,157,588],"type":"title","angle":0,"index":31,"text":"# 分组查询（annotate）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"27570a5e-c739-4ff2-a4a2-d4f86461c6f7","page_size":[595,841],"block_position":"44-31"},{"bbox":[86,594,447,604],"type":"text","angle":0,"index":32,"text":"分组查询一般会用到聚合函数，所以使用前要先从 django.db.models 引入 Avg,Max,Min,Count,Sum（首字母大写）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"b4e48437-c7b5-4b00-9c1a-d5069c447a2d","page_size":[595,841],"block_position":"44-32"},{"bbox":[87,610,303,619],"type":"text","angle":0,"index":33,"text":"from django.db.models import Avg,Max,Min,Count,Sum # 引入函数","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"74d8e8c6-7200-4a7f-9ebc-e2e340489319","page_size":[595,841],"block_position":"44-33"},{"bbox":[87,625,114,634],"type":"title","angle":0,"index":34,"text":"# 返回值：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"3b494fdd-b68e-403f-80d0-bd0c708e90cc","page_size":[595,841],"block_position":"44-34"},{"bbox":[104,641,361,651],"type":"text","angle":0,"index":35,"text":"分组后，用 values 取值，则返回值是 QuerySet 数据类型里面为一个个字典；","id":"0c72f7f8-223f-47f8-8b21-c7bf80edb423","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"page_size":[595,841],"block_position":"44-35"},{"bbox":[104,656,373,666],"type":"text","angle":0,"index":36,"text":"分组后，用 values_list 取值，则返回值是 QuerySet 数据类型里面为一个个元组。","id":"83af444a-0af6-4a7b-8022-c52b537a3603","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"page_size":[595,841],"block_position":"44-36"},{"bbox":[87,672,285,682],"type":"text","angle":0,"index":38,"text":"MySQL 中的 limit 相当于 ORM 中的 QuerySet 数据类型的切片。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"09e77510-0265-4e65-825f-003c7f683402","page_size":[595,841],"block_position":"44-37"},{"bbox":[87,687,107,698],"type":"title","angle":0,"index":39,"text":"# 注意：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":44,"id":"d4065ebe-afce-4673-a039-cba0eca678dd","page_size":[595,841],"block_position":"44-38"},{"bbox":[87,703,171,713],"type":"text","angle":0,"index":40,"text":"annotate 里面放聚合函数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"id":"0331009c-193c-445f-bbb3-c7b781d58a70","page_size":[595,841],"block_position":"44-39"},{"bbox":[86,719,504,744],"type":"text","angle":0,"index":41,"text":"values 或者 values_list 放在 annotate 前面：values 或者 values_list 是声明以什么字段分组，annotate 执行分组。前者相当于GROUP BY,后者相当于聚合函数","id":"e089f362-1670-44c7-a09c-74102ab39df6","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"page_size":[595,841],"block_position":"44-40"},{"bbox":[86,750,504,760],"type":"text","angle":0,"index":42,"text":"values 或者 values_list 放在 annotate 后面： annotate 表示直接以当前表的 pk 执行分组，values 或者 values_list 表示查询哪","id":"638d3777-5127-46a6-926c-4de024b8ddd0","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":44,"page_size":[595,841],"block_position":"44-41"}],[{"bbox":[105,80,384,90],"type":"text","angle":0,"index":0,"text":"些字段， 并且要将 annotate 里的聚合函数起别名，在 values 或者 values_list 里写其别名。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"867cd483-29bc-4c71-a529-bb6763b162ee","page_size":[595,841],"block_position":"45-0"},{"bbox":[88,96,279,106],"type":"title","angle":0,"index":1,"text":"# annotate 里相当于聚合函数，value 相当于 groupby 了","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":45,"id":"8ee618a2-a48b-4b16-a0bb-015e92743c24","page_size":[595,841],"block_position":"45-1"},{"bbox":[87,111,354,169],"index":2,"angle":0,"type":"algorithm","text":"res  $=$  models.Publish.objects.values(\"name\"). annotate(in_price  $\\equiv$  Min(\"book_price\"))   \nprint(res)   \nres  $=$  models.Book.objects annotate(c  $=$  Count(\"authors_name\").values(\"title\",\"c\")   \nprint(res)","id":"28964260-a321-4942-af65-ed35a4125d73","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"page_size":[595,841],"block_position":"45-2"},{"bbox":[88,174,115,184],"type":"title","angle":0,"index":3,"text":"# F() 查询","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":45,"id":"9767ec46-e642-4390-9016-e8aaca041d62","page_size":[595,841],"block_position":"45-3"},{"bbox":[87,189,343,199],"type":"text","angle":0,"index":4,"text":"F() 的实例可以在查询中引用字段，来比较同一个 model 实例中两个不同字段的值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"76b0729b-0f9e-449a-9cf4-0ec32b2aed07","page_size":[595,841],"block_position":"45-4"},{"bbox":[87,205,411,215],"type":"text","angle":0,"index":5,"text":"之前构造的过滤器都只是将字段值与某个常量做比较，如果想要对两个字段的值做比较，就需要用到 F()。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"22e7b8ef-094f-4b6f-b2ab-4460edcd680a","page_size":[595,841],"block_position":"45-5"},{"bbox":[87,221,213,230],"type":"text","angle":0,"index":6,"text":"使用前要先从 django.db.models 引入 F:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"7ba1f8d3-7fea-4f93-9311-c91256f060d9","page_size":[595,841],"block_position":"45-6"},{"bbox":[87,236,189,245],"type":"text","angle":0,"index":7,"text":"from django.db.models import F","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"9eae4994-49ef-4a27-b135-84b0d2f349d9","page_size":[595,841],"block_position":"45-7"},{"bbox":[88,252,107,261],"type":"title","angle":0,"index":8,"text":"# 用法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":45,"id":"235e247b-fa47-450c-b9cd-86a33f5bd594","page_size":[595,841],"block_position":"45-8"},{"bbox":[87,267,132,277],"type":"text","angle":0,"index":9,"text":"F(\"字段名称\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"e17cea8d-2c30-4498-a249-db23fbf63e37","page_size":[595,841],"block_position":"45-9"},{"bbox":[87,282,218,292],"type":"text","angle":0,"index":10,"text":"F 动态获取对象字段的值，可以进行运算。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"ab6876d7-f554-450f-9bb3-0bbeb57036e4","page_size":[595,841],"block_position":"45-10"},{"bbox":[87,298,324,308],"type":"text","angle":0,"index":11,"text":"Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"5dc98c5e-4b89-4827-80bd-b59292957fca","page_size":[595,841],"block_position":"45-11"},{"bbox":[87,314,218,323],"type":"text","angle":0,"index":12,"text":"修改操作（update）也可以使用 F() 函数。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"ff5e33c8-87c8-40f2-ae89-374cfdc83fc7","page_size":[595,841],"block_position":"45-12"},{"bbox":[87,329,163,339],"type":"text","angle":0,"index":13,"text":"查询工资大于年龄的人：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"3407ba2c-ac21-4b8c-86b8-970208eb907d","page_size":[595,841],"block_position":"45-13"},{"bbox":[88,345,104,354],"type":"title","angle":0,"index":14,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":45,"id":"e82532dd-bcdb-4c29-9ed3-ed0fde0004a6","page_size":[595,841],"block_position":"45-14"},{"bbox":[87,360,192,370],"type":"text","angle":0,"index":15,"text":"from django.db.models import F","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"c36fa607-48e0-4f5c-9cdf-bf7d97b583c0","page_size":[595,841],"block_position":"45-15"},{"bbox":[88,379,96,384],"type":"text","angle":0,"index":16,"text":"...","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"02dd45b8-21ad-476c-9278-e294dc3f5c5e","page_size":[595,841],"block_position":"45-16"},{"bbox":[87,391,321,401],"type":"text","angle":0,"index":17,"text":"book=models.Emp.objects.filter(salary__gt=F(\"age\")).values(\"name\",\"age\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"7c8ac063-6b64-4e58-96ad-c5fc76e7fc63","page_size":[595,841],"block_position":"45-17"},{"bbox":[88,407,116,417],"type":"text","angle":0,"index":18,"text":"Q() 查询","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"2b290fb0-b01f-4b7c-bb89-2ceea2722e96","page_size":[595,841],"block_position":"45-18"},{"bbox":[87,423,214,433],"type":"text","angle":0,"index":19,"text":"使用前要先从 django.db.models 引入 Q:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"a95043e3-2852-41d3-bf10-f417c87a50a1","page_size":[595,841],"block_position":"45-19"},{"bbox":[88,439,190,449],"type":"text","angle":0,"index":20,"text":"from django.db.models import Q","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"814e27af-2cd3-4379-96c8-52dfd036c9de","page_size":[595,841],"block_position":"45-20"},{"bbox":[88,454,107,464],"type":"text","angle":0,"index":21,"text":"用法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"21b3614a-a9dc-4c3a-8c92-7ebbfcd7c902","page_size":[595,841],"block_position":"45-21"},{"bbox":[88,486,128,496],"type":"text","angle":0,"index":22,"text":"Q(条件判断)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"034e38f1-07c9-47ed-bc71-80005777e850","page_size":[595,841],"block_position":"45-22"},{"bbox":[88,501,107,510],"type":"text","angle":0,"index":23,"text":"例如：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"cab87c9d-71e1-4239-9c00-6cc65995d48f","page_size":[595,841],"block_position":"45-23"},{"bbox":[87,533,164,543],"type":"text","angle":0,"index":24,"text":"Q(title__startswith=\"菜\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"2859654c-9d65-4234-91d3-9235a9456b5b","page_size":[595,841],"block_position":"45-24"},{"bbox":[87,547,432,557],"type":"text","angle":0,"index":25,"text":"之前构造的过滤器里的多个条件的关系都是 and，如果需要执行更复杂的查询（例如 or 语句），就可以使用 Q 。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"1fa1332e-2688-4cce-beae-bc5c75eeb4d3","page_size":[595,841],"block_position":"45-25"},{"bbox":[87,579,247,589],"type":"text","angle":0,"index":26,"text":"Q 对象可以使用 & | ~ （与 或非）操作符进行组合。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"5688ddf4-4208-40fc-9bf3-188bf5dd29dc","page_size":[595,841],"block_position":"45-26"},{"bbox":[87,610,163,620],"type":"text","angle":0,"index":27,"text":"优先级从高到低：~ & |。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"694fb2f4-f38f-432d-85d9-7b6e432ce6ef","page_size":[595,841],"block_position":"45-27"},{"bbox":[86,641,504,666],"type":"text","angle":0,"index":28,"text":"可以混合使用 Q 对象和关键字参数，Q 对象和关键字参数是用\"and\"拼在一起的（即将逗号看成 and ），但是 Q 对象必须位于所有关键字参数的前面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"b81c4c0b-dbab-4298-92f7-5d3f84acb963","page_size":[595,841],"block_position":"45-28"},{"bbox":[87,687,268,698],"type":"text","angle":0,"index":29,"text":"查询价格大于 350 或者名称以菜开头的书籍的名称和价格。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"d9533c83-72f9-4986-bbe1-f3d8b934151c","page_size":[595,841],"block_position":"45-29"},{"bbox":[87,703,296,714],"type":"text","angle":0,"index":30,"text":"查询出版日期是 2004 或者1999 年，并且书名中包含有\"菜\"的书籍。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"ec9800cd-5bf3-4103-b2e1-81032245210b","page_size":[595,841],"block_position":"45-30"},{"bbox":[87,719,267,729],"type":"text","angle":0,"index":31,"text":"Q 对象和关键字混合使用，Q 对象要在所有关键字的前面:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":45,"id":"27778a97-2d9d-4620-a4d1-371246b9b552","page_size":[595,841],"block_position":"45-31"}],[{"bbox":[88,85,119,101],"type":"title","angle":0,"index":0,"text":"# 总结","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":46,"id":"cad6059e-a865-4756-a750-e7f058432056","page_size":[595,841],"block_position":"46-0"},{"bbox":[95,153,185,163],"type":"text","angle":0,"index":1,"text":"books=models.Book.objects","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"6bd8245f-3ae3-47ef-b59b-c87858a496ca","page_size":[595,841],"block_position":"46-1"},{"bbox":[95,168,174,179],"type":"text","angle":0,"index":2,"text":"print(books,type(books))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"3379a733-5c4a-41f9-9ec7-1bb2bd9b3c5a","page_size":[595,841],"block_position":"46-2"},{"bbox":[88,181,465,196],"type":"text","angle":0,"index":3,"text":"TestModel.Book.objects <class 'django.db.models.manager.Manager'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"57393f91-ba2d-403c-803d-fd2a57719303","page_size":[595,841],"block_position":"46-3"},{"bbox":[88,200,433,211],"type":"text","angle":0,"index":4,"text":"books $=$ models.Book.objects.create(title=\"如来神掌\",price=200,publish=\"功夫出版社\",pub_date=\"2010-10-10\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"7d0f4ea6-6429-4f85-8894-5be66b949c3b","page_size":[595,841],"block_position":"46-4"},{"bbox":[96,215,234,225],"type":"text","angle":0,"index":5,"text":"print(books, type(books)) # Book object (18)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"9542b3b4-da9c-4e34-b38c-b4c68da7075c","page_size":[595,841],"block_position":"46-5"},{"bbox":[88,229,308,243],"type":"text","angle":0,"index":6,"text":"Book object (7) <class 'TestModel.models.Book'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"5fb3b375-d458-4cff-9001-8432b0a3a376","page_size":[595,841],"block_position":"46-6"},{"bbox":[95,246,202,256],"type":"text","angle":0,"index":7,"text":"books $=$ models.Book.objects.all()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"8bbb5896-c394-48c0-adff-368a5e26d44d","page_size":[595,841],"block_position":"46-7"},{"bbox":[95,262,174,272],"type":"text","angle":0,"index":8,"text":"print(books,type(books))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"8b4e09a1-4c08-417f-b116-4887b077ad0f","page_size":[595,841],"block_position":"46-8"},{"bbox":[88,277,433,287],"type":"text","angle":0,"index":9,"text":"<QuerySet [<Book: Book object $\\cdot$ …,<Book: Book object (7)>]> <class 'django.db.models.query.QuerySet'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"c398f39f-b768-4ac5-b489-1d1f1d871012","page_size":[595,841],"block_position":"46-9"},{"bbox":[95,292,299,303],"type":"text","angle":0,"index":10,"text":"books $=$ models.Book.objects.first() # 返回所有数据的第一条数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"d5f9b56e-adc7-4b5f-92cc-2968f851e935","page_size":[595,841],"block_position":"46-10"},{"bbox":[95,308,176,318],"type":"text","angle":0,"index":11,"text":"print(books, type(books))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"f7290ad5-63a9-4e73-86ba-c9b7a1154b4a","page_size":[595,841],"block_position":"46-11"},{"bbox":[88,324,242,333],"type":"text","angle":0,"index":12,"text":"Book object (1) <class 'TestModel.models.Book'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"cd2d39b3-f640-4aed-9d6e-e3afea561e6b","page_size":[595,841],"block_position":"46-12"},{"bbox":[88,340,111,349],"type":"text","angle":0,"index":13,"text":"等同于","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"6acb2039-c41c-4981-a562-910eb34155b0","page_size":[595,841],"block_position":"46-13"},{"bbox":[95,355,301,365],"type":"text","angle":0,"index":14,"text":"books $=$ models.Book.objects.filter() # 返回所有数据的第一条数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"fce3d314-0b16-47ef-887f-7ba77ebb5ac3","page_size":[595,841],"block_position":"46-14"},{"bbox":[95,370,191,380],"type":"text","angle":0,"index":15,"text":"print(books[0], type(books[0]))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"2b7c672d-30fd-46b5-a5ee-9b8a2f99dd20","page_size":[595,841],"block_position":"46-15"},{"bbox":[88,386,242,396],"type":"text","angle":0,"index":16,"text":"Book object (1) <class 'TestModel.models.Book'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"24266f44-5610-43f9-af6c-f0a564397c77","page_size":[595,841],"block_position":"46-16"},{"bbox":[88,401,243,412],"type":"text","angle":0,"index":17,"text":"books $=$ models.Book.objects.values(\"pk\",\"price\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"e2243824-e688-454f-b03b-2db20e1e839e","page_size":[595,841],"block_position":"46-17"},{"bbox":[95,417,304,428],"type":"text","angle":0,"index":18,"text":"print(books,type(books)) # 得到的是第一条记录的 price 字段的数据","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"e31e128c-1de5-44f6-90a8-13b87273bb07","page_size":[595,841],"block_position":"46-18"},{"bbox":[88,433,489,443],"type":"text","angle":0,"index":19,"text":"<QuerySet [{'pk': 1, 'price': Decimal('300.00')},… , {'pk': 7, 'price': Decimal('200.00')}]> <class 'django.db.models.query.QuerySet'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"14d7ec6a-b2ee-4239-b3ad-60c88c2b746c","page_size":[595,841],"block_position":"46-19"},{"bbox":[95,449,278,459],"type":"text","angle":0,"index":20,"text":"books $=$ models.Book.objects.values_list(\"price\",\"publish\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"c64c71b0-36c1-4bfa-8051-104a5729e108","page_size":[595,841],"block_position":"46-20"},{"bbox":[95,465,174,474],"type":"text","angle":0,"index":21,"text":"print(books,type(books))","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"4d6748de-1f0f-44e7-b843-16aa437099bc","page_size":[595,841],"block_position":"46-21"},{"bbox":[87,480,505,491],"type":"text","angle":0,"index":22,"text":"<QuerySet [(Decimal('300.00'), ' 菜 鸟 出 版 社 '), …. (Decimal('200.00'), ' 功 夫 出 版 社 '), (Decimal('200.00'), ' 功 夫 出 版 社 ')]> <class","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"98161d5e-e01a-458a-a359-5f71233f584e","page_size":[595,841],"block_position":"46-22"},{"bbox":[88,495,202,505],"type":"text","angle":0,"index":23,"text":"'django.db.models.query.QuerySet'>","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"6db2af07-739d-43c2-aa49-cef00d79077b","page_size":[595,841],"block_position":"46-23"},{"bbox":[88,511,252,521],"type":"text","angle":0,"index":24,"text":"1. Book 对象（<class 'TestModel.models.Book'>）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"956152bb-01cb-4aa8-abd5-540434f3fefb","page_size":[595,841],"block_position":"46-24"},{"bbox":[105,527,369,537],"type":"text","angle":0,"index":25,"text":"含义：Book 是 Django 模型（Model）的一个实例，对应数据库中的一行记录。","id":"e520d13e-b7fc-4c9b-9de7-82c0769a5d49","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-25"},{"bbox":[105,542,358,552],"type":"text","angle":0,"index":26,"text":"作用：表示单个数据对象，可以访问其字段（如book.title、book.price）。","id":"b7c940c9-2600-42d5-83b7-868cebd53e27","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-26"},{"bbox":[105,558,143,568],"type":"text","angle":0,"index":27,"text":". 示例：","id":"3fe8f94c-77ea-4e03-8c66-8163f5ddb0f8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-27"},{"bbox":[105,573,143,582],"type":"text","angle":0,"index":28,"text":". 特点：","id":"5addebbd-8e35-4e95-879f-5a0c9d929973","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-28"},{"bbox":[141,588,283,598],"type":"text","angle":0,"index":30,"text":"o 是 TestModel.models.Book 类的实例。","id":"24a42447-88da-4093-90fc-f54a0925d360","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-29"},{"bbox":[141,603,308,614],"type":"text","angle":0,"index":31,"text":"o 可以直接修改并保存到数据库（book.save()）。","id":"bdbf60dd-efa9-4593-96d9-387a0df16715","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-30"},{"bbox":[87,635,304,646],"type":"text","angle":0,"index":33,"text":"2. Book.objects（<class 'django.db.models.manager.Manager'>）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"id":"b773f49e-1c58-43ed-9b36-dcbe97060caa","page_size":[595,841],"block_position":"46-31"},{"bbox":[104,651,392,661],"type":"text","angle":0,"index":34,"text":"含义：objects 是 Django 模型的默认管理器（Manager），用于执行数据库查询操作。","id":"10f95c9b-c4c1-4c8a-bfbd-4eeeebdd3d29","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-32"},{"bbox":[105,666,355,677],"type":"text","angle":0,"index":35,"text":"作用：提供查询方法（如 all(), filter(), get(), create()），用于操作数据库。","id":"6177779c-fa4d-4a06-99f6-fbe3d46b6d92","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-33"},{"bbox":[105,682,143,692],"type":"text","angle":0,"index":36,"text":"示例：","id":"6da42f44-a1ce-4860-9665-4513bea71f35","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-34"},{"bbox":[141,698,232,708],"type":"text","angle":0,"index":38,"text":"o 是 Manager 类的实例。","id":"efdbf273-cedc-4fcc-b0fe-17a6e82a7eef","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-35"},{"bbox":[141,713,355,723],"type":"text","angle":0,"index":39,"text":"o 不直接返回数据，而是返回QuerySet（查询集）或单个Book。","id":"4f03d40a-d570-4a96-9688-0951db65ee1a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-36"},{"bbox":[141,729,369,740],"type":"text","angle":0,"index":40,"text":"o 可以自定义管理器（如 class BookManager(models.Manager)）。","id":"5a4e5d2b-440a-4837-b0e5-c13052bf6bf9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":46,"page_size":[595,841],"block_position":"46-37"}],[{"bbox":[86,80,283,90],"type":"text","angle":0,"index":0,"text":"3. QuerySet（<class 'django.db.models.query.QuerySet'>）","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"58a2e3cd-0a97-4683-b8ab-f3db3948d95e","page_size":[595,841],"block_position":"47-0"},{"bbox":[104,95,418,105],"type":"text","angle":0,"index":1,"text":"含义：QuerySet 是 Django 查询数据库返回的结果集，可以包含0 个、1 个或多个Book 对象。","id":"60bac8f7-176d-4aa3-b655-8c4e2dc08d4c","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-1"},{"bbox":[105,111,388,121],"type":"text","angle":0,"index":2,"text":"作用：用于链式查询（如过滤、排序、聚合等），但不会立即执行查询（惰性加载）。","id":"74645198-4d82-44bb-a9a7-d86b196ef8a5","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-2"},{"bbox":[105,127,143,136],"type":"text","angle":0,"index":3,"text":"示例：","id":"3645e79d-0887-4b64-893d-b04919132418","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-3"},{"bbox":[141,142,441,152],"type":"text","angle":0,"index":5,"text":"o 是惰性的，只有在真正使用时（如遍历、list(queryset)、len(queryset)）才会查询数据库。","id":"a3f36107-1ab7-4db0-b4c7-5976a30ec819","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-4"},{"bbox":[141,158,370,168],"type":"text","angle":0,"index":6,"text":"o 可以进一步过滤（filter()）、排序（order_by()）、切片（[:5]）等。","id":"bd9fb9e0-03d0-483d-ab70-6752c738b060","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-5"},{"bbox":[141,174,389,183],"type":"text","angle":0,"index":7,"text":"o 如果只返回一个对象（如 get()），则返回 Book 对象，而不是 QuerySet。","id":"c900f696-d406-43d6-b20c-28d80a5a330f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-6"},{"bbox":[86,189,242,199],"type":"text","angle":0,"index":9,"text":"2. 为什么 QuerySet 类型不变，但数据形式不同？","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"90647045-6a15-4787-865d-fd026f183b96","page_size":[595,841],"block_position":"47-7"},{"bbox":[104,205,458,215],"type":"text","angle":0,"index":10,"text":"QuerySet 是 Django 的惰性查询集，它只是生成 SQL 查询的容器，具体返回的数据形式由调用的方法决定：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"1d5c34d3-a8e1-498f-aceb-13382644e0ce","page_size":[595,841],"block_position":"47-8"},{"bbox":[141,220,230,229],"type":"text","angle":0,"index":11,"text":"o all() → 返回模型实例。","id":"1e94d964-9413-42e1-bc89-ac00bb156d26","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-9"},{"bbox":[141,236,230,244],"type":"text","angle":0,"index":12,"text":"o values() → 返回字典。","id":"149aecfb-7386-4756-b29b-aed51a69d059","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-10"},{"bbox":[141,251,272,261],"type":"text","angle":0,"index":13,"text":"o values_list() → 返回元组或单个值。","id":"4f2c5436-1af8-413b-b533-b012250f34b6","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-11"},{"bbox":[104,267,504,292],"type":"text","angle":0,"index":15,"text":"但 QuerySet 本身的类型始终是 django.db.models.query.QuerySet，因为它代表的是“查询能力”，而不是具体的数据形式。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"ad18ebc0-826e-440f-8624-3920a038ae6c","page_size":[595,841],"block_position":"47-12"},{"bbox":[87,313,164,323],"type":"title","angle":0,"index":16,"text":"# 3. 如何选择合适的方法？","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":47,"id":"163913ca-4958-4e2d-aaa4-7cc3e323ae30","page_size":[595,841],"block_position":"47-13"},{"bbox":[86,335,505,498],"index":17,"angle":0,"type":"table_body","img_path":"/","id":"9423f90b-203b-46ad-af22-f8c0abd3acf5","color":{"line":"rgba(103, 194, 63, 1)","fill":"rgba(103, 194, 63, 1)"},"table_body":"<table><tr><td>方法</td><td>返回的数据形式</td><td>适用场景</td></tr><tr><td>all()</td><td>QuerySet[Model 实例]</td><td>需要完整模型对象（如调用 save()、访问关联字段）</td></tr><tr><td>values(&quot;field1&quot;, &quot;field2&quot;)</td><td>QuerySet[dict]</td><td>只需要部分字段，且希望用字段名访问</td></tr><tr><td>values_list(&quot;field1&quot;, &quot;field2&quot;)</td><td>QuerySet[tuple]</td><td>只需要字段值，不关心字段名</td></tr><tr><td>values_list(&quot;field&quot;, flat=True)</td><td>QuerySet[单值]</td><td>只需要一个字段的列表（如 [1, 2, 3])</td></tr></table>","page_idx":47,"page_size":[595,841],"block_position":"47-14"},{"bbox":[86,500,505,527],"type":"text","angle":0,"index":18,"text":"是的！authors $=$ models.ManyToManyField(\"Author\") 这一行代码会自动创建一个中间表（关联表）来存储多对多关系，但不会直接修改Author 表或当前模型表的结构。以下是详细解释：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"a0b164fd-4166-4072-8d81-408d6836e67b","page_size":[595,841],"block_position":"47-15"},{"bbox":[87,547,154,556],"type":"title","angle":0,"index":19,"text":"# 1. 自动创建的中间表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":47,"id":"0149e0e4-6c4a-4c27-8391-b2c39eafc049","page_size":[595,841],"block_position":"47-16"},{"bbox":[86,562,505,587],"type":"text","angle":0,"index":20,"text":"Django 会为你生成一个名为<当前模型表名>_authors 的中间表（例如，如果当前模型是 Book，则表名为book_authors），其结构如下：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"4cbb6030-72f7-4443-abe0-877e91cd32cf","page_size":[595,841],"block_position":"47-17"},{"bbox":[87,594,299,682],"index":21,"angle":0,"type":"code","text":"```sql\nCREATE TABLE book_authors (\nid INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 示例\nbook_id INTEGER NOT NULL, -- 外键指向Book表\nauthor_id INTEGER NOT NULL, -- 外键指向Author表\nFOREIGN KEY (book_id) REFERENCES book(id),\nFOREIGN KEY (author_id) REFERENCES author(id)\n```","id":"7dffa7f5-f6a9-4c80-8279-a063914189a7","color":{"line":"rgba(200, 140, 58, 1)","fill":"rgba(200, 140, 58, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-18"},{"bbox":[87,688,95,697],"type":"text","angle":0,"index":22,"text":");","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"94f8c92d-2606-4a1e-a475-f32cd9b3bc6c","page_size":[595,841],"block_position":"47-19"},{"bbox":[104,703,362,713],"type":"text","angle":0,"index":23,"text":"一 这个表只有 3 个字段：id（主键）、book_id（外键）、author_id（外键）。","id":"886585aa-2d2f-4cd9-85f6-3f2a08cca2aa","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-20"},{"bbox":[105,719,394,729],"type":"text","angle":0,"index":24,"text":"你不需要手动定义这个表，Django 在运行makemigrations 和migrate 时会自动创建。","id":"8004cc71-56a0-4969-a7ef-4a96bfeea2ec","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"page_size":[595,841],"block_position":"47-21"},{"bbox":[87,734,127,744],"type":"title","angle":0,"index":26,"text":"# 5. 注意事项","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":47,"id":"7e3d69db-f0df-4d4b-9d49-9293c0c30b55","page_size":[595,841],"block_position":"47-22"},{"bbox":[105,750,157,759],"type":"text","angle":0,"index":27,"text":"1. 表名规则：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":47,"id":"8523217a-efa8-4f38-9270-13b9dd382b6f","page_size":[595,841],"block_position":"47-23"}],[{"bbox":[141,79,401,89],"type":"text","angle":0,"index":0,"text":"o 自动生成的中间表名格式：<当前模型表名>_<字段名 $>$ （如 book_authors）。","id":"255517ed-fe38-4c8d-9d47-17d119a0030a","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-0"},{"bbox":[141,95,375,105],"type":"text","angle":0,"index":1,"text":"o 如果当前模型表名是 app_book，则中间表名为 app_book_authors。","id":"e1144468-fcac-4d75-801b-3362a0a4cc00","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-1"},{"bbox":[105,111,157,121],"type":"title","angle":0,"index":3,"text":"# 2. 迁移顺序：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"850845e3-25ec-464f-bc75-4f797c2e4893","page_size":[595,841],"block_position":"48-2"},{"bbox":[141,126,324,136],"type":"text","angle":0,"index":4,"text":"o 确保Author 模型已正确定义并先迁移，否则会报错。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"6834f071-484c-46aa-9d9b-31be02ddebce","page_size":[595,841],"block_position":"48-3"},{"bbox":[105,142,171,152],"type":"title","angle":0,"index":5,"text":"# 3. 数据库一致性：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"afc6c707-2815-44c2-a9dd-20c7dd653214","page_size":[595,841],"block_position":"48-4"},{"bbox":[141,158,396,168],"type":"text","angle":0,"index":6,"text":"o 不要手动修改中间表，始终通过 Django ORM 操作（如 add()、remove()）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"63000ec0-555c-4f17-8bdc-4cfa7eee40ff","page_size":[595,841],"block_position":"48-5"},{"bbox":[88,189,104,199],"type":"title","angle":0,"index":7,"text":"# 总结","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"73f0087d-ba0c-4934-8228-0c14080b29eb","page_size":[595,841],"block_position":"48-6"},{"bbox":[87,212,195,222],"type":"text","angle":0,"index":8,"text":"行为 结果","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"80efb515-4333-4221-995c-85e7904a2769","page_size":[595,841],"block_position":"48-7"},{"bbox":[87,243,254,253],"type":"text","angle":0,"index":9,"text":"定义 ManyToManyField Django 自动创建中间表","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"5ef05318-0e84-4c52-9211-bdad36c8c19f","page_size":[595,841],"block_position":"48-8"},{"bbox":[87,274,294,285],"type":"text","angle":0,"index":10,"text":"默认中间表字段 id、<当前模型>_id、<关联模型>_id","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"91c9d7af-0d04-43a7-acd3-a858912c4248","page_size":[595,841],"block_position":"48-9"},{"bbox":[87,306,271,316],"type":"text","angle":0,"index":11,"text":"自定义中间表 使用 through= 参数指定模型","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"d5228747-15d7-461f-8b27-65bda0ec8567","page_size":[595,841],"block_position":"48-10"},{"bbox":[87,336,301,347],"type":"text","angle":0,"index":12,"text":"操作关系 通过 add()、remove()、clear() 等方法","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"96bfd5bd-9167-4faa-9bb4-f158dbc34c69","page_size":[595,841],"block_position":"48-11"},{"bbox":[87,360,265,370],"type":"text","angle":0,"index":13,"text":"在 Django 中，当你定义一个 ForeignKey 字段时，例如：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"dc7d8095-a47a-4ad9-a20e-c5ff55da5627","page_size":[595,841],"block_position":"48-12"},{"bbox":[88,376,111,386],"type":"text","angle":0,"index":14,"text":"python","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"3d61b693-22a1-48a9-9cf0-4c50f9bad518","page_size":[595,841],"block_position":"48-13"},{"bbox":[88,391,104,401],"type":"text","angle":0,"index":15,"text":"复制","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"63ce0d90-d58f-4b4f-8b35-b98a5af5215a","page_size":[595,841],"block_position":"48-14"},{"bbox":[88,407,104,416],"type":"text","angle":0,"index":16,"text":"下载","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"80c8135c-91b7-4986-acd4-292a0e98ed4e","page_size":[595,841],"block_position":"48-15"},{"bbox":[87,423,310,432],"type":"text","angle":0,"index":17,"text":"publish $=$ models.ForeignKey(\"Publish\", on_delete=models.CASCADE)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"85ec7920-2678-4d7a-9e05-26b37b710032","page_size":[595,841],"block_position":"48-16"},{"bbox":[87,438,474,448],"type":"text","angle":0,"index":18,"text":"Django 实际上会在数据库中创建一个名为publish_id 的列，而不是publish。这是由 Django 的设计机制决定的，原因如下：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"dc57c77c-de4c-48c1-bbbb-aa71a6b6644a","page_size":[595,841],"block_position":"48-17"},{"bbox":[87,469,236,479],"type":"title","angle":0,"index":19,"text":"# 1. 为什么字段名是 publish_id 而不是 publish？","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"cee240a1-5a92-4f67-9520-9007a8c8aed5","page_size":[595,841],"block_position":"48-18"},{"bbox":[87,485,171,494],"type":"title","angle":0,"index":20,"text":"# (1) 数据库层面的外键存储","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"a3490d32-9193-4d39-afaa-5b7f38964b33","page_size":[595,841],"block_position":"48-19"},{"bbox":[104,500,454,510],"type":"text","angle":0,"index":21,"text":"在关系型数据库（如 MySQL、PostgreSQL、SQLite）中，外键关系是通过存储目标表的主键值来实现的。","id":"25a3373e-b027-437e-8715-32b8a5286e15","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-20"},{"bbox":[104,516,487,526],"type":"text","angle":0,"index":22,"text":". 例如，如果 Publish 表的主键是 id，那么 Book 表会有一个 publish_id 列，存储的是 Publish 表中某条记录的 id 值。","id":"3bd62184-8268-4c3b-aaac-583721fa2100","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-21"},{"bbox":[105,532,214,541],"type":"text","angle":0,"index":23,"text":"1. 为什么列名不同也能关联？","id":"8c28a655-d92d-4c93-9f87-0101b6f4fe80","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-22"},{"bbox":[104,547,504,571],"type":"text","angle":0,"index":24,"text":"在关系型数据库（如 MySQL、PostgreSQL、SQLite）中，外键关联的本质是值匹配，而不是列名匹配。只要满足以下条件即可：","id":"8624e228-4690-4945-a9a4-48d001b89b94","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-23"},{"bbox":[87,594,167,604],"type":"title","angle":0,"index":27,"text":"# (2) Django 的 ORM 抽象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"e8240bf4-370a-44b9-82a6-4dacb9580f13","page_size":[595,841],"block_position":"48-24"},{"bbox":[104,609,506,619],"type":"text","angle":0,"index":28,"text":"虽然数据库列名是publish_id，但 Django 在Python 模型层面提供了一个名为publish 的属性，用于方便地访问关联对象。","id":"7c2630a9-ceb4-4e86-a486-c80291cdb7f0","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-25"},{"bbox":[105,625,376,635],"type":"text","angle":0,"index":29,"text":"当你访问 book.publish 时，Django 会自动执行查询，获取对应的 Publish 对象。","id":"66cc37b7-f3f3-4473-a069-88acedb011a2","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-26"},{"bbox":[105,640,383,650],"type":"text","angle":0,"index":30,"text":"而 book.publish_id 则直接返回数据库中存储的原始外键值（即 Publish 表的 id）。","id":"08e34c80-86f3-4660-acdb-e987fc620c7e","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"page_size":[595,841],"block_position":"48-27"},{"bbox":[87,656,183,666],"type":"title","angle":0,"index":32,"text":"# 2. Django 如何实现这种关联？","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"57aee600-2945-48f1-b938-47262fc4e923","page_size":[595,841],"block_position":"48-28"},{"bbox":[92,672,143,682],"type":"title","angle":0,"index":33,"text":"# （1）数据库层面","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":48,"id":"6a3d201d-18ac-40ca-9558-13f5a8fda9c3","page_size":[595,841],"block_position":"48-29"},{"bbox":[105,687,282,697],"type":"text","angle":0,"index":34,"text":"Django 生成的 SQL 会明确指定外键关联的目标列：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"18d346d1-9e1c-4448-aefa-48a092edab3c","page_size":[595,841],"block_position":"48-30"},{"bbox":[88,703,99,712],"type":"text","angle":0,"index":35,"text":"sql","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"bc309fcc-d449-492f-8797-26cb90a2dc26","page_size":[595,841],"block_position":"48-31"},{"bbox":[88,719,104,728],"type":"text","angle":0,"index":36,"text":"复制","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"8498076b-43d2-4fcb-928a-a71d4a825d9d","page_size":[595,841],"block_position":"48-32"},{"bbox":[88,735,104,743],"type":"text","angle":0,"index":37,"text":"下载","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"55d8db16-4de0-4be4-971d-54b42fd571ce","page_size":[595,841],"block_position":"48-33"},{"bbox":[87,750,260,759],"type":"text","angle":0,"index":38,"text":"FOREIGN KEY (publish_id) REFERENCES Publish(id)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":48,"id":"d1d4cf4c-de65-465b-aab9-95bd3f0372ea","page_size":[595,841],"block_position":"48-34"}],[{"bbox":[87,80,278,89],"type":"text","angle":0,"index":0,"text":"这里显式声明了 publish_id 关联到 Publish.id，与列名无关。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"9b4f4644-e395-44ac-82f1-20e65138ce27","page_size":[595,841],"block_position":"49-0"},{"bbox":[92,95,141,105],"type":"title","angle":0,"index":1,"text":"# （2）ORM 层面","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":49,"id":"23dd06b7-d7aa-424d-96c4-2583ce71b966","page_size":[595,841],"block_position":"49-1"},{"bbox":[105,111,326,121],"type":"text","angle":0,"index":2,"text":"当你访问 book.publish 时，Django 会自动执行类似以下的查询：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"2c35f300-9024-4195-a264-17d02a7a60f6","page_size":[595,841],"block_position":"49-2"},{"bbox":[87,126,264,137],"type":"text","angle":0,"index":3,"text":"SELECT * FROM Publish WHERE id $=$ book.publish_id;","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"1e3476da-2f03-4104-9637-8e9ad75658b5","page_size":[595,841],"block_position":"49-3"},{"bbox":[87,142,237,153],"type":"text","angle":0,"index":4,"text":"通过 publish_id 的值找到对应的 Publish 记录。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"5ea2c336-c939-4a0f-bd17-aa1104f52c70","page_size":[595,841],"block_position":"49-4"},{"bbox":[87,160,140,169],"type":"title","angle":0,"index":5,"text":"# 3. 核心区别对比","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":49,"id":"8e6537d3-2f00-44c5-bc64-39cab332d11f","page_size":[595,841],"block_position":"49-5"},{"bbox":[86,182,418,374],"index":6,"angle":0,"type":"table_body","img_path":"/","id":"5a39c79c-7468-44ed-ba7e-5651e4129f23","color":{"line":"rgba(103, 194, 63, 1)","fill":"rgba(103, 194, 63, 1)"},"table_body":"<table><tr><td>特性</td><td>.add()</td><td>.create()</td></tr><tr><td>作用</td><td>关联已存在的对象</td><td>创建新对象并关联</td></tr><tr><td>是否创建新对象</td><td>□否</td><td>□是</td></tr><tr><td>适用关系类型</td><td>ManyToManyField, ForeignKey</td><td>ManyToManyField, ForeignKey的反向查询</td></tr><tr><td>参数类型</td><td>对象或ID</td><td>新对象的字段键值对</td></tr><tr><td>返回值</td><td>无</td><td>新创建的对象</td></tr></table>","page_idx":49,"page_size":[595,841],"block_position":"49-6"},{"bbox":[88,405,298,433],"type":"title","angle":0,"index":7,"text":"# Django Form 组件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":49,"id":"3f09397f-772d-4fb1-93a0-4a7b6ce0de18","page_size":[595,841],"block_position":"49-7"},{"bbox":[87,444,458,454],"type":"text","angle":0,"index":8,"text":"Django Form 组件用于对页面进行初始化，生成 HTML 标签，此外还可以对用户提交的数据进行校验（显示错误信息）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"90e6b49d-c40d-4c8f-81ef-b78167a58ff4","page_size":[595,841],"block_position":"49-8"},{"bbox":[87,476,149,485],"type":"text","angle":0,"index":9,"text":"报错信息显示顺序：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"333f35b7-9827-4bd4-a9b0-b9dfe95e5d21","page_size":[595,841],"block_position":"49-9"},{"bbox":[87,507,289,516],"type":"text","angle":0,"index":10,"text":"先显示字段属性中的错误信息，然后再显示局部钩子的错误信息。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"1094091f-a638-450b-805a-4cbbfd9ada93","page_size":[595,841],"block_position":"49-10"},{"bbox":[87,523,289,532],"type":"text","angle":0,"index":11,"text":"若显示了字段属性的错误信息，就不会显示局部钩子的错误信息。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"bbb72efb-e7c6-4890-915b-46d5d18fd77c","page_size":[595,841],"block_position":"49-11"},{"bbox":[87,538,428,548],"type":"text","angle":0,"index":12,"text":"若有全局钩子，则全局钩子是等所有的数据都校验完，才开始进行校验，并且全局钩子的错误信息一定会显示。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"8e821586-0b53-471f-9d3b-ca8b7e315c5f","page_size":[595,841],"block_position":"49-12"},{"bbox":[88,565,432,593],"type":"title","angle":0,"index":13,"text":"# Django 用户认证（Auth）组件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":49,"id":"a3a22655-033d-4ee8-8704-c29be460b8f0","page_size":[595,841],"block_position":"49-13"},{"bbox":[86,605,467,615],"type":"text","angle":0,"index":14,"text":"Django 用户认证（Auth）组件一般用在用户的登录注册上，用于判断当前的用户是否合法，并跳转到登陆成功或失败页面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"529ae487-198e-49f7-b5f9-814982f4a3e5","page_size":[595,841],"block_position":"49-14"},{"bbox":[87,621,246,630],"type":"text","angle":0,"index":15,"text":"Django 用户认证（Auth）组件需要导入 auth 模块:","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"11509790-8760-4f61-a8eb-e9b42a9ddcbf","page_size":[595,841],"block_position":"49-15"},{"bbox":[87,637,124,645],"type":"text","angle":0,"index":16,"text":"# 认证模块","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"a8bf8f36-4dcf-45f1-a69f-c1288a7c1145","page_size":[595,841],"block_position":"49-16"},{"bbox":[87,652,186,661],"type":"text","angle":0,"index":17,"text":"from django.contrib import auth","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"602da66a-f25c-48d4-b213-73f4ed0dbf0a","page_size":[595,841],"block_position":"49-17"},{"bbox":[87,683,131,692],"type":"text","angle":0,"index":18,"text":"# 对应数据库","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"ddd5f35d-7085-435e-8381-ed4f247594f2","page_size":[595,841],"block_position":"49-18"},{"bbox":[87,699,228,708],"type":"text","angle":0,"index":19,"text":"from django.contrib.auth.models import User","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"8deb68fa-7ffd-40d5-ad97-53977c0d943d","page_size":[595,841],"block_position":"49-19"},{"bbox":[87,714,149,724],"type":"text","angle":0,"index":20,"text":"返回值是用户对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"1e78c63c-05a5-479c-827b-642bb9c3fbb2","page_size":[595,841],"block_position":"49-20"},{"bbox":[87,730,170,740],"type":"text","angle":0,"index":21,"text":"创建用户对象的三种方法：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"51858296-e40f-4601-9bc5-b11b39493ca9","page_size":[595,841],"block_position":"49-21"},{"bbox":[105,745,266,755],"type":"text","angle":0,"index":22,"text":"create()：创建一个普通用户，密码是明文的。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":49,"id":"53de4867-90e0-44e3-9fb3-4c3208edb90f","page_size":[595,841],"block_position":"49-22"}],[{"bbox":[105,80,285,89],"type":"text","angle":0,"index":0,"text":"create_user()：创建一个普通用户，密码是密文的。","id":"2fef82db-91dc-4047-b1ca-7ff220e12ac5","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"page_size":[595,841],"block_position":"50-0"},{"bbox":[104,96,393,105],"type":"text","angle":0,"index":1,"text":"create_superuser()：创建一个超级用户，密码是密文的，要多传一个邮箱email 参数。","id":"74727f6d-3aff-40a8-ab4b-06f9be387ce3","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"page_size":[595,841],"block_position":"50-1"},{"bbox":[88,111,370,121],"type":"text","angle":0,"index":3,"text":"验证用户的用户名和密码使用 authenticate() 方法，从需要auth_user 表中过滤出用户对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"b4ed78e7-9e95-48c1-be86-f6707e2f8763","page_size":[595,841],"block_position":"50-2"},{"bbox":[88,142,135,153],"type":"text","angle":0,"index":4,"text":"使用前要导入：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"1738b81f-669e-4b52-8f0b-718adcf626a4","page_size":[595,841],"block_position":"50-3"},{"bbox":[87,174,187,184],"type":"text","angle":0,"index":5,"text":"from django.contrib import auth","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"14f83563-8118-4b90-a933-51f6a2494612","page_size":[595,841],"block_position":"50-4"},{"bbox":[88,190,107,198],"type":"text","angle":0,"index":6,"text":"参数：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"186af5b6-1bd0-4db5-8c6f-ca9c8c718569","page_size":[595,841],"block_position":"50-5"},{"bbox":[87,221,149,230],"type":"text","angle":0,"index":7,"text":"username：用户名","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"bdbeedd5-0792-43f1-a287-399e989ec57f","page_size":[595,841],"block_position":"50-6"},{"bbox":[88,237,141,245],"type":"text","angle":0,"index":8,"text":"password：密码","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"d47ca79d-ce91-48c1-9f10-05f482f204e3","page_size":[595,841],"block_position":"50-7"},{"bbox":[87,252,279,261],"type":"text","angle":0,"index":9,"text":"返回值：如果验证成功，就返回用户对象，反之，返回 None。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"8dbef886-c71f-466c-a730-c2d975520be5","page_size":[595,841],"block_position":"50-8"},{"bbox":[87,267,286,276],"type":"text","angle":0,"index":10,"text":"给验证成功的用户加 session，将 request.user 赋值为用户对象。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"44c6fd28-9274-4072-b895-26adec022452","page_size":[595,841],"block_position":"50-9"},{"bbox":[88,283,158,292],"type":"text","angle":0,"index":11,"text":"登陆使用 login() 方法。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"1162c74d-1970-410a-89cd-f12bea5733e2","page_size":[595,841],"block_position":"50-10"},{"bbox":[88,299,135,307],"type":"text","angle":0,"index":12,"text":"使用前要导入：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"b7918904-9998-46de-91af-2c8b9ee96a63","page_size":[595,841],"block_position":"50-11"},{"bbox":[87,314,186,323],"type":"text","angle":0,"index":13,"text":"from django.contrib import auth","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"6b979749-39b0-4d45-816b-77c478870a3b","page_size":[595,841],"block_position":"50-12"},{"bbox":[88,330,107,338],"type":"text","angle":0,"index":14,"text":"参数：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"324f51c6-6448-4f6d-8c20-2ed5ac9ec5ce","page_size":[595,841],"block_position":"50-13"},{"bbox":[105,345,185,354],"type":"text","angle":0,"index":15,"text":"request：用户对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"265ddb4d-2aba-4fee-bd4d-a6eef997a635","page_size":[595,841],"block_position":"50-14"},{"bbox":[87,360,357,370],"type":"text","angle":0,"index":16,"text":"注销用户使用 logout() 方法，需要清空 session 信息，将 request.user 赋值为匿名用户。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"5f0cfc8f-dbe9-43ff-9c74-d9d959a3c086","page_size":[595,841],"block_position":"50-15"},{"bbox":[88,376,135,386],"type":"text","angle":0,"index":17,"text":"使用前要导入：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"d0c882ef-e100-47f5-9bca-e083e81e80ce","page_size":[595,841],"block_position":"50-16"},{"bbox":[87,392,187,401],"type":"text","angle":0,"index":18,"text":"from django.contrib import auth","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"18b880c7-ed17-4763-a102-bb3ac9c2619d","page_size":[595,841],"block_position":"50-17"},{"bbox":[88,408,107,416],"type":"text","angle":0,"index":19,"text":"参数：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"71da906e-b1db-44b3-b3dd-0b7860cad4c6","page_size":[595,841],"block_position":"50-18"},{"bbox":[105,423,185,433],"type":"text","angle":0,"index":20,"text":"request：用户对象","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"cb70451f-cbb2-4305-8d48-f20a4214f91f","page_size":[595,841],"block_position":"50-19"},{"bbox":[88,439,135,448],"type":"text","angle":0,"index":21,"text":"返回值：None","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"e5248bef-5542-4f03-a4dd-7aa6759cdd02","page_size":[595,841],"block_position":"50-20"},{"bbox":[87,454,281,463],"type":"text","angle":0,"index":22,"text":"设置装饰器，给需要登录成功后才能访问的页面统一加装饰器。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"d1f3199e-3f1c-4963-b093-0b3be0c017b2","page_size":[595,841],"block_position":"50-21"},{"bbox":[88,470,135,479],"type":"text","angle":0,"index":23,"text":"使用前要导入：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"70dc7506-cea9-4081-ba9d-a1e0d7b6b405","page_size":[595,841],"block_position":"50-22"},{"bbox":[87,486,268,495],"type":"text","angle":0,"index":24,"text":"from django.contrib.auth.decorators import login_required","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"b05820ef-34e3-450f-a790-5dcf54b968b5","page_size":[595,841],"block_position":"50-23"},{"bbox":[88,502,104,510],"type":"title","angle":0,"index":25,"text":"# 实例","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":50,"id":"c44c3163-dece-4160-9080-dc39041529be","page_size":[595,841],"block_position":"50-24"},{"bbox":[87,517,326,526],"type":"text","angle":0,"index":26,"text":"from django.contrib.auth.decorators import login_required $@$ login_required","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"d9b6c00e-9b96-41db-a6db-4120cebee19b","page_size":[595,841],"block_position":"50-25"},{"bbox":[88,533,149,541],"type":"text","angle":0,"index":27,"text":"def index(request):","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"8074d27e-bf56-406d-90b8-339dfdb02abc","page_size":[595,841],"block_position":"50-26"},{"bbox":[91,549,223,557],"type":"text","angle":0,"index":28,"text":"return HttpResponse(\"index 页面。。。\")","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"cf2beba1-af27-4ab5-9565-a01abfa809a4","page_size":[595,841],"block_position":"50-27"},{"bbox":[88,564,246,572],"type":"text","angle":0,"index":29,"text":"设置从哪个页面访问，登录成功后就返回哪个页面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"50bb4c49-8853-4a97-9de4-b76a72929c06","page_size":[595,841],"block_position":"50-28"},{"bbox":[88,579,107,588],"type":"title","angle":0,"index":30,"text":"# 解析：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":50,"id":"2d7d427a-b321-4cc3-93f2-7ae75d980989","page_size":[595,841],"block_position":"50-29"},{"bbox":[87,595,333,603],"type":"text","angle":0,"index":31,"text":"django 在用户访问页面时，如果用户是未登录的状态，就给用户返回登录页面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"08097228-1351-4be0-bb1d-5ffa7c70c71a","page_size":[595,841],"block_position":"50-30"},{"bbox":[87,610,304,619],"type":"text","angle":0,"index":32,"text":"此时，该登录页面的 URL 后面有参数：next=用户访问的页面的 URL。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"59193a48-4879-4601-874e-3d3de48c1c92","page_size":[595,841],"block_position":"50-31"},{"bbox":[87,626,281,635],"type":"text","angle":0,"index":33,"text":"因此，设置在用户登录成功后重定向的 URL 为 next 参数的值。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"5f4f0470-4db3-48cc-9057-974ed4179cf5","page_size":[595,841],"block_position":"50-32"},{"bbox":[87,641,482,650],"type":"text","angle":0,"index":34,"text":"但是，若用户一开始就输入登录页面 logi，request.GET.get(\"next\") 就取不到值，所以在后面加or，可以设置自定义返回的页面。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"fac459bf-b747-4a20-942d-d34de3c48fef","page_size":[595,841],"block_position":"50-33"},{"bbox":[88,669,384,697],"type":"title","angle":0,"index":35,"text":"# Django cookie 与 session","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":50,"id":"0a9f572a-74ba-4643-8d0b-17cac51166e3","page_size":[595,841],"block_position":"50-34"},{"bbox":[87,708,306,718],"type":"text","angle":0,"index":36,"text":"Cookie 是存储在客户端计算机上的文本文件，并保留了各种跟踪信息。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"fd81ac4c-de5d-4675-91d5-5c059d2a72b8","page_size":[595,841],"block_position":"50-35"},{"bbox":[88,724,177,734],"type":"text","angle":0,"index":37,"text":"识别返回用户包括三个步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"e7ee6cc9-7fdc-466c-8e28-12dbff6fb260","page_size":[595,841],"block_position":"50-36"},{"bbox":[105,740,348,749],"type":"text","angle":0,"index":38,"text":"服务器脚本向浏览器发送一组Cookie。例如：姓名、年龄或识别号码等。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":50,"id":"4aca0805-88d0-47b4-b393-5f4025712c96","page_size":[595,841],"block_position":"50-37"}],[{"bbox":[104,80,297,89],"type":"text","angle":0,"index":0,"text":"浏览器将这些信息存储在本地计算机上，以备将来使用。","id":"9d1bbec3-afee-4257-8c8c-638d732dab25","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"page_size":[595,841],"block_position":"51-0"},{"bbox":[104,95,504,120],"type":"text","angle":0,"index":1,"text":"当下一次浏览器向 Web 服务器发送任何请求时，浏览器会把这些 Cookie 信息发送到服务器，服务器将使用这些信息来识别用户。","id":"353afd41-36c9-4ece-a221-3adcd86dce96","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"page_size":[595,841],"block_position":"51-1"},{"bbox":[86,126,504,152],"type":"text","angle":0,"index":3,"text":"HTTP 是一种\"无状态\"协议，这意味着每次客户端检索网页时，客户端打开一个单独的连接到 Web 服务器，服务器会自动不保留之前客户端请求的任何记录。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"id":"93bfecc3-7a55-4f61-bfa5-dbedd15f25f0","page_size":[595,841],"block_position":"51-2"},{"bbox":[87,158,337,168],"type":"text","angle":0,"index":4,"text":"但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"id":"b18b0532-eddf-4ff1-a668-8d3748d295a0","page_size":[595,841],"block_position":"51-3"},{"bbox":[87,174,117,182],"type":"title","angle":0,"index":5,"text":"# Cookies","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":51,"id":"56d24853-ce13-4a34-848a-1427bc5481e4","page_size":[595,841],"block_position":"51-4"},{"bbox":[86,189,503,214],"type":"text","angle":0,"index":6,"text":"一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie，对于客户端的后续请求可以使用接收到的cookie 来识别。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"id":"81705041-dbab-402e-a2da-bf033c8a3789","page_size":[595,841],"block_position":"51-5"},{"bbox":[87,220,336,230],"type":"text","angle":0,"index":7,"text":"在 Web 开发中，使用 session 来完成会话跟踪，session 底层依赖 Cookie 技术。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"id":"71ec5c16-8f06-4085-9d9a-0bd5b2f2212b","page_size":[595,841],"block_position":"51-6"},{"bbox":[88,232,390,384],"index":8,"angle":0,"type":"image","img_path":"/9a48075248f18fba9020fddb11e4edfdde6582563e4eadd68f5b3ee2169d2f8d.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.507563025210084,"page_idx":51,"id":"8b65aaf4-e9c4-479a-ade8-ae9972cff85d","page_size":[595,841],"block_position":"51-7"},{"bbox":[86,391,227,403],"type":"title","angle":0,"index":9,"text":"# Session(保存在服务端的键值对)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":51,"id":"348369fc-ea95-4105-9d02-67c4ea049664","page_size":[595,841],"block_position":"51-8"},{"bbox":[86,406,509,466],"type":"text","angle":0,"index":10,"text":"服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象，由于 session 为用户浏览器独享，所以用户在访问服务器的 web 资源时，可以把各自的数据放在各自的 session 中，当用户再去访问该服务器中的其它web 资源时，其它web 资源再从用户各自的 session 中取出数据为用户服务。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":51,"id":"47ff907e-2c74-478c-969e-5276ff7d71f3","page_size":[595,841],"block_position":"51-9"},{"bbox":[91,480,477,736],"index":11,"angle":0,"type":"image","img_path":"/13016cbec949f6ef478321a5634a2c0188ff9b392a433e44d44ca4da2df9e845.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.6487394957983194,"page_idx":51,"id":"40f97726-d586-4282-8074-60cc149833d6","page_size":[595,841],"block_position":"51-10"},{"bbox":[88,749,130,761],"type":"title","angle":0,"index":12,"text":"# 工作原理","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":51,"id":"2da8ca87-7608-4fb8-ab2b-671fd5d5381a","page_size":[595,841],"block_position":"51-11"}],[{"bbox":[104,79,303,92],"type":"text","angle":0,"index":0,"text":"a. 浏览器第一次请求获取登录页面 login。","id":"463fcc08-7672-49a6-a26f-b66d582564df","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-0"},{"bbox":[104,95,502,123],"type":"text","angle":0,"index":1,"text":" b. 浏览器输入账号密码第二次请求，若输入正确，服务器响应浏览器一个 index 页面和一个键为 sessionid，值为随机字符串的 cookie，即 set_cookie (\"sessionid\",随机字符串)。","id":"7663e77b-b999-42d7-8189-b88a3f2e59c7","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-1"},{"bbox":[104,126,343,138],"type":"text","angle":0,"index":2,"text":" c. 服务器内部在 django.session 表中记录一条数据。","id":"4cc10d90-25a6-44f9-8a93-e4ae89400f56","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-2"},{"bbox":[86,142,226,154],"type":"text","angle":0,"index":4,"text":"django.session 表中有三个字段。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"ca5d1d90-2b4a-49d2-9e7e-845cb0e72d46","page_size":[595,841],"block_position":"52-3"},{"bbox":[140,157,502,185],"type":"text","angle":0,"index":5,"text":"o session_key：存的是随机字符串，即响应给浏览器的 cookie 的 sessionid 键对应的值。","id":"1f5a9795-60db-46b7-a659-275a2e379cdc","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-4"},{"bbox":[140,188,501,216],"type":"text","angle":0,"index":6,"text":"o session_data：存的是用户的信息，即多个 request.session[\"key\"]=value，且是密文。","id":"ebc11069-cb56-483c-82b5-a99f8fcf48a8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-5"},{"bbox":[140,219,397,232],"type":"text","angle":0,"index":7,"text":"o expire_date：存的是该条记录的过期时间（默认 14 天）","id":"8567f055-d58f-478f-a059-4aa5626382fe","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-6"},{"bbox":[104,235,492,264],"type":"text","angle":0,"index":9,"text":" d. 浏览器第三次请求其他资源时，携带cookie :{sessionid:随机字符串}，服务器从django.session 表中根据该随机字符串取出该用户的数据，供其使用（即保存状态）。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"802eab67-9c70-4547-b82a-3e5bbdd13a46","page_size":[595,841],"block_position":"52-7"},{"bbox":[86,266,501,294],"type":"text","angle":0,"index":10,"text":"注意: django.session 表中保存的是浏览器的信息，而不是每一个用户的信息。 因此， 同一浏览器多个用户请求只保存一条记录（后面覆盖前面）,多个浏览器请求才保存多条记录。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"a65dec99-d5d4-4fc9-bdfc-77642119d08c","page_size":[595,841],"block_position":"52-8"},{"bbox":[86,297,498,341],"type":"text","angle":0,"index":11,"text":"cookie 弥补了 http 无状态的不足，让服务器知道来的人是\"谁\"，但是 cookie 以文本的形式保存在浏览器端，安全性较差，且最大只支持 4096 字节，所以只通过 cookie 识别不同的用户，然后，在对应的 session 里保存私密的信息以及超过 4096 字节的文本。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"1c80dd17-5006-42ee-bf6b-9285c689534d","page_size":[595,841],"block_position":"52-9"},{"bbox":[86,344,145,356],"type":"text","angle":0,"index":12,"text":"session 设置：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"016d4941-504a-4c03-9d5d-a4c14dfb2124","page_size":[595,841],"block_position":"52-10"},{"bbox":[86,359,212,372],"type":"text","angle":0,"index":13,"text":"request.session[\"key\"] $=$ value","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"b2b7f0fb-2651-4e8e-a312-b1f09a04370d","page_size":[595,841],"block_position":"52-11"},{"bbox":[86,375,135,387],"type":"text","angle":0,"index":14,"text":"执行步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"d56b828a-34b2-4ec5-98dc-e68bdfdf8e76","page_size":[595,841],"block_position":"52-12"},{"bbox":[104,391,205,403],"type":"text","angle":0,"index":15,"text":"a. 生成随机字符串","id":"1d85241b-9606-4022-926a-f6420a13e5f8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-13"},{"bbox":[104,407,498,434],"type":"text","angle":0,"index":16,"text":" b. 把随机字符串和设置的键值对保存到 django_session 表的 session_key 和 session_data里","id":"77751c21-19fc-4a01-89e0-5d221e326a09","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-14"},{"bbox":[104,438,409,450],"type":"text","angle":0,"index":17,"text":" c. 设置 cookie：set_cookie(\"sessionid\",随机字符串) 响应给浏览器","id":"0f15477f-ebcd-49a2-a33e-32ad06c23f96","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-15"},{"bbox":[86,454,145,465],"type":"text","angle":0,"index":19,"text":"session 获取：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"3bcda425-8ee6-4cc4-a0f2-d885a74ce850","page_size":[595,841],"block_position":"52-16"},{"bbox":[86,469,190,481],"type":"text","angle":0,"index":20,"text":"request.session.get('key')","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"442927a5-11cf-49c6-a6b0-451de90bd3af","page_size":[595,841],"block_position":"52-17"},{"bbox":[86,484,135,497],"type":"text","angle":0,"index":21,"text":"执行步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"7f3fb53d-32cc-4f6c-8d76-c9a88263a283","page_size":[595,841],"block_position":"52-18"},{"bbox":[104,500,352,512],"type":"text","angle":0,"index":22,"text":" a. 从 cookie 中获取 sessionid 键的值，即随机字符串。","id":"2d08eb2e-c420-45d1-a9a7-1dd44da89d07","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-19"},{"bbox":[104,515,346,528],"type":"text","angle":0,"index":23,"text":" b. 根据随机字符串从 django_session 表过滤出记录。","id":"8b6ffb6b-a2e3-4561-a4fe-199d0af64ada","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-20"},{"bbox":[105,531,264,544],"type":"text","angle":0,"index":24,"text":" c. 取出 session_data 字段的数据。","id":"9ae374f7-7932-4b82-8020-1d487d83b9e8","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-21"},{"bbox":[86,546,465,560],"type":"text","angle":0,"index":26,"text":"session 删除，删除整条记录（包括 session_key、session_data、expire_date 三个字段）：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"6425a830-8e56-4e7b-8eb6-41e1f19f0a99","page_size":[595,841],"block_position":"52-22"},{"bbox":[86,562,179,575],"type":"text","angle":0,"index":27,"text":"request.session.flush()","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"bb3249e3-6ad5-4606-a3c5-27f7edb3e30a","page_size":[595,841],"block_position":"52-23"},{"bbox":[86,577,259,591],"type":"text","angle":0,"index":28,"text":"删除 session_data 里的其中一组键值对：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"fdc1a09d-c90a-4f33-91c2-feb7fd0caff5","page_size":[595,841],"block_position":"52-24"},{"bbox":[86,593,194,606],"type":"text","angle":0,"index":29,"text":"del request.session[\"key\"]","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"ab241588-daa6-4264-ac12-b5113aab4375","page_size":[595,841],"block_position":"52-25"},{"bbox":[86,608,135,621],"type":"text","angle":0,"index":30,"text":"执行步骤：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"a59bbbda-bcde-4554-a027-af20cca5a671","page_size":[595,841],"block_position":"52-26"},{"bbox":[104,624,348,637],"type":"text","angle":0,"index":31,"text":" a. 从 cookie 中获取 sessionid 键的值，即随机字符串","id":"a76e92b3-d06b-4289-9475-1eda372564aa","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-27"},{"bbox":[104,640,342,652],"type":"text","angle":0,"index":32,"text":" b. 根据随机字符串从 django_session 表过滤出记录","id":"670a9311-ecd0-4007-bc04-9dc0cd808caf","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-28"},{"bbox":[105,655,226,667],"type":"text","angle":0,"index":33,"text":" c. 删除过滤出来的记录","id":"07442822-ec1d-4c00-ad13-c7ea78d3f07f","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"page_size":[595,841],"block_position":"52-29"},{"bbox":[86,671,154,684],"type":"title","angle":0,"index":35,"text":"# Django 中间件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"level":1,"page_idx":52,"id":"388e5aed-cf93-4833-b66a-8d9cca225bdb","page_size":[595,841],"block_position":"52-30"},{"bbox":[86,687,499,715],"type":"text","angle":0,"index":36,"text":"Django 中间件是修改 Django request 或者 response 对象的钩子，可以理解为是介于 HttpRequest与 HttpResponse 处理之间的一道处理过程。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"716b5b9a-f0b6-4cd8-a9ca-cd7aeefe5036","page_size":[595,841],"block_position":"52-31"},{"bbox":[86,718,476,731],"type":"text","angle":0,"index":37,"text":"浏览器从请求到响应的过程中，Django 需要通过很多中间件来处理，可以看如下图所示：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":52,"id":"c9f82995-472f-412d-922b-76f0bae4b63e","page_size":[595,841],"block_position":"52-32"}],[{"bbox":[88,80,485,306],"index":0,"angle":0,"type":"image","img_path":"/eff2575789a078e5215193fc6d91fb3d590196cf4b9a4bc9c76cfb08807856a7.jpg","color":{"line":"rgba(89, 92, 220, 1)","fill":"rgba(89, 92, 220, 1)"},"img_ratio":0.6672268907563025,"page_idx":53,"id":"aa4265e4-a1ed-4501-be3a-2c0adba28625","page_size":[595,841],"block_position":"53-0"},{"bbox":[87,328,176,341],"type":"text","angle":0,"index":1,"text":"Django 中间件作用：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"0f145d07-6362-430a-8a90-eaf645c15f6e","page_size":[595,841],"block_position":"53-1"},{"bbox":[105,344,339,358],"type":"text","angle":0,"index":2,"text":" 修改请求，即传送到 view 中的 HttpRequest 对象。","id":"8ab733b6-4af6-4637-9461-23eb15c1dcb9","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"page_size":[595,841],"block_position":"53-2"},{"bbox":[105,360,325,373],"type":"text","angle":0,"index":3,"text":" 修改响应，即 view 返回的 HttpResponse 对象。","id":"97984ec8-1f12-4724-ac55-0301fbbed1ac","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"page_size":[595,841],"block_position":"53-3"},{"bbox":[86,375,375,388],"type":"text","angle":0,"index":5,"text":"中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"7d0a0e35-fc39-428a-bcc3-2b69ce967a8a","page_size":[595,841],"block_position":"53-4"},{"bbox":[87,391,343,403],"type":"text","angle":0,"index":6,"text":"配置中的每个字符串选项都是一个类，也就是一个中间件。","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"4a01f10f-be1b-4880-9ea5-3eaf526ca543","page_size":[595,841],"block_position":"53-5"},{"bbox":[88,406,151,418],"type":"text","angle":0,"index":7,"text":"自定义中间件","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"7fd8fab3-a3a8-4539-b3a4-8717e505a5f9","page_size":[595,841],"block_position":"53-6"},{"bbox":[87,422,244,434],"type":"text","angle":0,"index":8,"text":"中间件可以定义四个方法，分别是：","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"302737e6-f920-4421-9233-ae17e259162f","page_size":[595,841],"block_position":"53-7"},{"bbox":[86,454,207,465],"type":"text","angle":0,"index":9,"text":"process_request(self,request)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"af9fc510-a647-4efa-92e1-e692d06b0c78","page_size":[595,841],"block_position":"53-8"},{"bbox":[87,469,351,481],"type":"text","angle":0,"index":10,"text":"process_view(self, request, view_func, view_args, view_kwargs)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"cd7e1a28-0e13-4e6a-bf40-6b844aa9c867","page_size":[595,841],"block_position":"53-9"},{"bbox":[88,485,262,497],"type":"text","angle":0,"index":11,"text":"process_exception(self, request, exception)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"9c234000-d623-4fe9-a9d3-2b65b6baa9f8","page_size":[595,841],"block_position":"53-10"},{"bbox":[88,501,255,513],"type":"text","angle":0,"index":12,"text":"process_response(self, request, response)","color":{"line":"rgba(13, 83, 222, 1)","fill":"rgba(13, 83, 222, 1)"},"page_idx":53,"id":"de75b9f6-eea2-4d53-b5cb-16af8e2fc1b7","page_size":[595,841],"block_position":"53-11"}]],"mergeConnections":[]}