{"id":15136003,"url":"https://github.com/liaogx/imooc","last_synced_at":"2025-07-07T03:02:43.975Z","repository":{"id":111528900,"uuid":"180813549","full_name":"liaogx/imooc","owner":"liaogx","description":"由浅入深全面掌握Django ORM开发的知识，以Django官方文档为依据，内容完整、准确、权威。视频学习地址：","archived":false,"fork":false,"pushed_at":"2020-07-27T15:07:42.000Z","size":515,"stargazers_count":66,"open_issues_count":0,"forks_count":38,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-30T18:04:17.415Z","etag":null,"topics":["django","mysql","orm","pycharm","python"],"latest_commit_sha":null,"homepage":"https://www.imooc.com/learn/1087","language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liaogx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-11T14:47:38.000Z","updated_at":"2024-11-11T09:11:47.000Z","dependencies_parsed_at":"2023-06-28T08:30:38.103Z","dependency_job_id":null,"html_url":"https://github.com/liaogx/imooc","commit_stats":null,"previous_names":[],"tags_count":1,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liaogx%2Fimooc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liaogx%2Fimooc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liaogx%2Fimooc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liaogx%2Fimooc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liaogx","download_url":"https://codeload.github.com/liaogx/imooc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237821367,"owners_count":19371739,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","mysql","orm","pycharm","python"],"created_at":"2024-09-26T06:03:20.354Z","updated_at":"2025-02-08T14:30:48.458Z","avatar_url":"https://github.com/liaogx.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 开发环境\n\nWindows/MacOS/Linux，搭建Django开发环境：\n\n- 前端：HTML/CSS + jQuery 3.3\n- Django 1.11\n- Python 3.6\n- MySQL 5.7\n\n数据库操作：\n\n```mysql\n# 创建数据库imooc\ncreate database imooc charset utf8;\n# 切换到imooc库\nUSE imooc;\n/*root：所有权限，只能localhost连接*/\nGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;\nFLUSH PRIVILEGES;\n```\n\n# 效果演示\n\n通过刷新前端，触发ORM操作\n\n![](./front.png)\n\nMySQL数据表（Django自带的数据表除外）\n\n![](./db_tables.png)\n\n# 课程内容\n\n\u003e 中级课程。由浅入深全面掌握Django ORM开发的知识，以Django官方文档为依据，内容完整、准确、权威\n\n## 第1章 课程介绍\n\n### 1.1 课程内容与导学\n\n介绍本课程的学习内容和目标，如何学习本课程，引导学生对Django ORM有一个基础且全面的了解，并能够在课程结束后独立使用Django完成ORM的开发。\n\n## 第2章 ORM介绍\n\n### 2.1 什么是ORM\n\nDjango ORM介绍，模型类的概念、由来、优势、劣势。\n\n## 第3章 字段类型和参数\n\n### 3.1 常用的字段\n\n全面介绍Django ORM中所有的字段。\n\n### 3.2 关系型字段\n\n一对一（OneToOneField）；多对一（ForeignKey）；多对多（ManyToManyKey），默认中间表。\n\n### 3.3 字段参数\n\n详解所有字段都有的公共参数和个别字段的私有参数。\n\n### 3.4 自关联\n\n以”省-市-县-村“为例，如何在一张表中实现自关联存储。\n\n## 第4章 元数据Meta\n\n### 4.1 元数据介绍\n\n讲解元数据的概念，举例常用的元数据。\n\n## 第5章 Django数据表操作\n\n### 5.1 Django更改数据表\n\n介绍migrations文件夹，django_migrations表的含义；Django ORM如何创建与更改数据表。\n\n### 5.2 Django数据导入\n\n使用`python manage.py shell/loaddata`写入，使用脚本或`creat()`、`bulk_create()`批量导入。\n\n### 5.3 Django数据导出\n\n通过` python manage.py dumpdata`导出数据，或用数据库自带的导出命令。\n\n## 第6章 Models API\n\n### 6.1 查询集QuerySet介绍\n\n查询集QuerySet介绍，如何创建、保存、检索、过滤；\n\n字段数据正则匹配，大小写敏感；\n\n结果切片，排序，链式查询；\n\n如何查看与执行生SQL语句。\n\n### 6.2 返回新QuerySet的API\n\n| Models API            | 使用说明                                       |\n| --------------------- | ---------------------------------------------- |\n| **filter()**          | 过滤查询对象                                   |\n| **exclude()**         | 排除满足条件的对象                             |\n| **annotate()**        | 使用聚合计数，求和，平均数等                   |\n| **order_by()**        | 对查询集进行排序                               |\n| **reverse()**         | 反向排序                                       |\n| **distinct()**        | 对查询集去重                                   |\n| **values()**          | 返回包含对象具体值的字典的QuerySet             |\n| **values_list()**     | 与values()类似，只是返回的是元组而不是字典     |\n| dates()               | 根据日期获取查询集                             |\n| datetimes()           | 根据时间获取查询集                             |\n| **none()**            | 创建空的查询集                                 |\n| **all()**             | 获取所有的对象                                 |\n| union()               | 并集                                           |\n| intersection()        | 交集                                           |\n| difference()          | 差集                                           |\n| `select_related()`    | 附带查询外键关联的对象，优化一对一，多对一查询 |\n| `prefetch_related()`  | 预先查询外键关联的对象，优化一对多，多对多查询 |\n| extra()               | 实现别名，条件，排序等                         |\n| defer()               | 排除不需要的字段                               |\n| only()                | 仅选择需要的字段                               |\n| using()               | 选择数据库                                     |\n| `select_for_update()` | 锁住选择的对象，直到事务结束                   |\n| raw()                 | 接收一个原始的SQL查询                          |\n\n### 6.3 不返回QuerySet的API\n\n| Models API             | 使用说明                           |\n| ---------------------- | ---------------------------------- |\n| **get()**              | 获取单个对象                       |\n| **create()**           | 创建对象，无需save()               |\n| **get_or_create()**    | 查询对象，如果没有找到就新建对象   |\n| **update_or_create()** | 更新对象，如果没有找到就创建对象   |\n| `bulk_create()`        | 批量创建对象                       |\n| **count()**            | 统计对象的个数                     |\n| `in_bulk()`            | 根据**主键值**的列表，批量返回对象 |\n| `iterator()`           | 获取包含对象的迭代器               |\n| **latest()**           | 获取最近的对象                     |\n| **earliest()**         | 获取最早的对象                     |\n| **first()**            | 获取第一个对象                     |\n| **last()**             | 获取最后一个对象                   |\n| **aggregate()**        | 聚合操作                           |\n| **exists()**           | 判断queryset中是否有对象           |\n| **update()**           | 批量更新对象                       |\n| **delete()**           | 批量删除对象                       |\n| as_manager()           | 获取管理器                         |\n\n### 6.4 自定义聚合查询\n\n实现一个自定义的聚合查询功能，比如group_concat。\n\n## 第7章 F对象与Q对象\n\n### 7.1 F对象与Q对象的使用\n\n如何使用F对象操作字段的数据，使用Q对象实现复杂的查询，结合AND, OR, NOT, |, ~, \u0026操作。\n\n## 第8章 课程总结\n\n### 8.1 课程总结\n\n![](./datatable_relation.png)\n\n在本课程中，我们通过开发4个具有关联关系的模型类（讲师、课程、学生、助教），把所有知识串联起来，全面的讲解了Models的开发知识。更高级的内容，如自定义字段、自定义管理器、自定义中间表和模型类的继承，欢迎关注后续课程。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliaogx%2Fimooc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliaogx%2Fimooc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliaogx%2Fimooc/lists"}