{"id":15572906,"url":"https://github.com/007gzs/django-cool","last_synced_at":"2025-04-15T06:10:59.632Z","repository":{"id":55078959,"uuid":"258684884","full_name":"007gzs/django-cool","owner":"007gzs","description":"django-cool","archived":false,"fork":false,"pushed_at":"2024-07-31T03:33:55.000Z","size":483,"stargazers_count":13,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T16:51:16.887Z","etag":null,"topics":["admin","apiview","django","django-cool","model","websocket"],"latest_commit_sha":null,"homepage":"https://django.cool","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/007gzs.png","metadata":{"files":{"readme":"README.rst","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":"2020-04-25T04:13:46.000Z","updated_at":"2024-07-31T03:33:58.000Z","dependencies_parsed_at":"2024-03-18T04:31:56.083Z","dependency_job_id":"9c252fb4-4008-4486-9d56-3d2d04c088bb","html_url":"https://github.com/007gzs/django-cool","commit_stats":{"total_commits":237,"total_committers":3,"mean_commits":79.0,"dds":0.03375527426160341,"last_synced_commit":"131c5731e91d61f97dfe16a410fa6d08fec940fd"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/007gzs%2Fdjango-cool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/007gzs%2Fdjango-cool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/007gzs%2Fdjango-cool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/007gzs%2Fdjango-cool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/007gzs","download_url":"https://codeload.github.com/007gzs/django-cool/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249016627,"owners_count":21198833,"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":["admin","apiview","django","django-cool","model","websocket"],"created_at":"2024-10-02T18:07:59.063Z","updated_at":"2025-04-15T06:10:59.610Z","avatar_url":"https://github.com/007gzs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"###########\nDjango Cool\n###########\n\n.. image:: https://img.shields.io/pypi/v/django-cool.svg\n       :target: https://pypi.org/project/django-cool\n\nDjango 框架快速使用扩展库\n\n`【阅读文档】 \u003chttps://docs.django.cool\u003e`_。\n\n本项目在以下代码托管网站同步更新:\n\n+ 码云：https://gitee.com/007gzs/django-cool\n+ GitHub：https://github.com/007gzs/django-cool\n\n安装与升级\n==========\n\n目前 Django Cool 支持的 Python 环境有 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12\n支持 Django 版本 2.2, 3.x, 4.x, 5.x\n\n为了简化安装过程，推荐使用 pip 进行安装\n\n.. code-block:: bash\n\n    pip install django-cool\n\n升级 Django Cool 到新版本::\n\n    pip install -U django-cool\n\n如果需要安装 GitHub 上的最新代码::\n\n    pip install https://github.com/007gzs/django-cool/archive/master.zip\n\n\n如果需要展示html接口文档需要安装markdown依赖::\n\n    pip install markdown\n\n如果使用websocket功能需要安装channels依赖::\n\n    pip install channels\u003e=2.4\n\n开始使用\n====================================\n\n`settings.py` 配置\n--------------------\n\n在 `INSTALLED_APPS` 中添加 `cool`\n\n.. code-block:: python\n\n    INSTALLED_APPS = (\n        ...\n        'cool',\n    )\n\n在 `settings.py` 中设置 `DJANGO_COOL`\n\n.. code-block:: python\n\n    DJANGO_COOL = {\n        'API_ERROR_CODES': (\n            ('ERR_DEMO_NOLOGIN', (10001, '请先登陆')),\n            ('ERR_DEMO_NOTFOUND', (10002, '用户名密码错误')),\n            ('ERR_DEMO_PERMISSION', (10003, '权限错误')),\n            ('ERR_DEMO_DUPLICATE_USERNAME', (10011, '用户名已存在')),\n            ('ERR_DEMO_DUPLICATE_MOBILE', (10012, '手机号已存在')),\n        )\n    }\n\n\nmodels扩展\n--------------------\n\n自定义 `Model` 继承 `BaseModel` 可使用扩展功能：\n\n+ 支持字段变更监控记录\n    - 通过 `save_changed()` 保存已修改字段\n\n+ 主键唯一键缓存\n    - 缓存获取： `get_obj_by_pk_from_cache()` `get_obj_by_unique_key_from_cache()`\n    - 删除缓存： `flush_cache_by_pk()` `flush_cache_by_unique_key()` `flush_cache()`\n\n+ 搜索字段自动生成\n    - `get_search_fields()` 自动生成搜索字段，默认返回所有设置索引的char和int类型字段\n\n后台管理扩展\n--------------------\n\n`BaseModelAdmin` 提供扩展功能：\n\n+ 默认列出所有基础字段\n+ 增加相关项列，通过外键快速跳转\n+ 增、删、改权限统一控制\n+ 提交保存时，检查数据是否被修改\n\n使用 `admin_register()` 装饰器可以快速将 `Model` 注册到后台管理\n\n.. code-block:: python\n\n    @admin_register\n    class Module(BaseModel):\n        name = models.CharField('module name', max_length=255)\n        code = models.CharField('module code', max_length=100, unique=True)\n\n\n    @admin_register(\n        list_display=['module', 'name'],\n        list_filter=['module', ],\n        change_view_readonly_fields=['code', ],\n        list_editable=['name', 'module']\n    )\n    class Permission(BaseModel):\n        name = models.CharField('permission name', max_length=255)\n        code = models.CharField('permission code', max_length=100)\n        module = model.ForeignKey(\n            Module, verbose_name='module', to_field='code', db_column='module_code', on_delete=models.PROTECT\n        )\n\napi接口扩展\n--------------------\n\n+ `CoolBFFAPIView` 可方便创建 ``application/x-www-form-urlencoded`` / ``multipart/form-data`` 方式的接口。\n+ `Meta` 类中配置参数列表 `param_fields` 后可以自动生成接口文档，自动做参数验证\n+ 使用 `ViewSite` 快速注册接口生成 `urlpatterns`\n\n使用样例：\n\n`views.py`:\n\n.. code-block:: python\n\n    from cool.views import ViewSite, CoolBFFAPIView, ErrorCode, CoolAPIException\n    from django.contrib.auth import authenticate, login\n    from django.db import IntegrityError\n    from django.db.models import Q\n    from rest_framework import fields\n\n    from . import serializer, constants\n\n    site = ViewSite(name='demo', app_name='demo')\n\n\n    @site\n    class UserRegister(CoolBFFAPIView):\n\n        name = '用户注册'\n        response_info_serializer_class = serializer.UserSerializer\n\n        def get_context(self, request, *args, **kwargs):\n            user = models.User.objects.filter(\n                Q(username=request.params.username) | Q(mobile=request.params.mobile)\n            ).first()\n            if user is not None:\n                if user.username == request.params.username:\n                    raise CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_USERNAME)\n                elif user.mobile == request.params.mobile:\n                    raise CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_MOBILE)\n            user = models.User()\n            user.username = request.params.username\n            user.mobile = request.params.mobile\n            user.nickname = request.params.nickname\n            user.name = request.params.name\n            user.avatar = request.params.avatar\n            user.gender = request.params.gender\n            user.set_password(request.params.password)\n            try:\n                user.save(force_insert=True)\n            except IntegrityError as exc:\n                if exc.args[0] == 1062:\n                    if exc.args[1].find('username') \u003e= 0:\n                        exc = CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_USERNAME)\n                    elif exc.args[1].find('mobile') \u003e= 0:\n                        exc = CoolAPIException(ErrorCode.ERR_DEMO_DUPLICATE_MOBILE)\n                raise exc\n            user = authenticate(self, base_username=request.params.username, base_password=request.params.password)\n            if user is None:\n                raise CoolAPIException(ErrorCode.ERR_DEMO_NOTFOUND)\n            login(request, user)\n            return serializer.UserSerializer(user, request=request).data\n\n        class Meta:\n            param_fields = (\n                ('username', fields.CharField(label='登陆名', max_length=64, help_text='字段说明，会显示在接口文档中')),\n                ('password', fields.CharField(label='密码'),\n                ('gender', fields.ChoiceField(label='性别', choices=constants.Gender.get_choices_list())),\n                ('mobile', fields.RegexField(r'1\\d{10}', label='手机号')),\n                ('nickname', fields.CharField(label='昵称', max_length=255)),\n                ('name', fields.CharField(label='姓名', default='', max_length=255)),\n                ('avatar', fields.ImageField(label='头像', default=None)),\n            )\n\n\n    urls = site.urls\n    urlpatterns = site.urlpatterns\n\n\n`urls.py`:\n\n.. code-block:: python\n\n    from django.contrib import admin\n    from django.urls import path, include\n    from cool.views import get_api_doc_html\n\n\n    api_patterns = [\n        path('demo/', include('example.apps.demo.views')),\n    ]\n    urlpatterns = [\n        path('cool/', include('cool.urls')),\n        path('admin/', admin.site.urls),\n        path('api/', include(api_patterns)),\n        path('api_doc.html', get_api_doc_html)\n    ]\n\n示例项目\n========\n\n`demo项目 \u003chttps://github.com/007gzs/django-cool-example/\u003e`_\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F007gzs%2Fdjango-cool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F007gzs%2Fdjango-cool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F007gzs%2Fdjango-cool/lists"}