Skip to content

Commit

Permalink
增加 MODEL_SET_DEFAULT_TO_DB_DEFAULT配置, 当 model 的 field 未设置 `db_defau…
Browse files Browse the repository at this point in the history
…lt` 时, 自动将 `db_default` 设置为 `default` 的值
  • Loading branch information
007gzs committed Mar 18, 2024
1 parent 656b70b commit 4417b6b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 9 deletions.
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Django 框架快速使用扩展库
安装与升级
==========

目前 Django Cool 支持的 Python 环境有 3.6, 3.7, 3.8, 3.9, 3.10
目前 Django Cool 支持的 Python 环境有 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12
支持 Django 版本 2.2, 3.x, 4.x, 5.x

为了简化安装过程,推荐使用 pip 进行安装
Expand Down
44 changes: 37 additions & 7 deletions cool/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,59 @@
from django.contrib import admin
from django.contrib.admin.filters import FieldListFilter, ListFilter
from django.db import models
from django.db.models import NOT_PROVIDED
from django.utils.translation import gettext_lazy as _

from cool.admin import filters
from cool.checks import register_checks
from cool.settings import cool_settings


def set_verbose_name_to_db_comment():
def get_field_value(field_name, field_index, default=None, *args, **kwargs):
ret = default
if field_name in kwargs:
ret = kwargs[field_name]
elif len(args) > field_index:
ret = args[field_index]
return ret


def set_filed_init_wrapper():
import django
from django.db.models.fields import Field
if django.VERSION < (4, 2):
verbose_name_to_db_comment = cool_settings.MODEL_SET_VERBOSE_NAME_TO_DB_COMMENT
default_to_db_default = cool_settings.MODEL_SET_DEFAULT_TO_DB_DEFAULT
if verbose_name_to_db_comment and django.VERSION < (4, 2):
import warnings
warnings.warn(
"Field.__init__ not support db_comment in Django " + django.__version__ + " < 4.2",
stacklevel=2
)
verbose_name_to_db_comment = False

if default_to_db_default and django.VERSION < (5, 0):
import warnings
warnings.warn(
"Not support db_comment in Django " + django.__version__ + " < 4.2",
"Field.__init__ not support db_default in Django " + django.__version__ + " < 5.0",
stacklevel=2
)
default_to_db_default = False

if not verbose_name_to_db_comment and not default_to_db_default:
return
init = Field.__init__

def init_wrapper(*_args, **_kwargs):
if 'verbose_name' in _kwargs and 'db_comment' not in _kwargs:
_kwargs['db_comment'] = _kwargs['verbose_name']
if verbose_name_to_db_comment:
verbose_name = get_field_value('verbose_name', 1, NOT_PROVIDED, *_args, **_kwargs)
db_comment = get_field_value('db_comment', 23, NOT_PROVIDED, *_args, **_kwargs)
if db_comment is NOT_PROVIDED and verbose_name is not NOT_PROVIDED:
_kwargs['db_comment'] = verbose_name
if default_to_db_default:
default = get_field_value('default', 10, NOT_PROVIDED, *_args, **_kwargs)
db_default = get_field_value('db_default', 24, NOT_PROVIDED, *_args, **_kwargs)
if db_default is NOT_PROVIDED and default is not NOT_PROVIDED:
_kwargs['db_default'] = default
init(*_args, **_kwargs)

Field.__init__ = init_wrapper
Expand All @@ -36,8 +67,7 @@ class CoolConfig(AppConfig):
verbose_name = _("Django Cool")

def ready(self):
if cool_settings.MODEL_SET_VERBOSE_NAME_TO_DB_COMMENT:
set_verbose_name_to_db_comment()
set_filed_init_wrapper()
register_checks()
if cool_settings.ADMIN_FILTER_USE_SELECT:
ListFilter.template = 'cool/admin/select_filter.html'
Expand Down
2 changes: 1 addition & 1 deletion cool/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
DEFAULTS = {
# Model
'MODEL_SET_VERBOSE_NAME_TO_DB_COMMENT': False,

'MODEL_SET_DEFAULT_TO_DB_DEFAULT': False,
# Admin
'ADMIN_AUTOCOMPLETE_CHECK_PERM': True,
'ADMIN_FILTER_USE_SELECT': True,
Expand Down
4 changes: 4 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
Changelog
================

Version 1.2.12
------------------
+ 增加 `MODEL_SET_DEFAULT_TO_DB_DEFAULT`配置, 当 model 的 field 未设置 `db_default` 时, 自动将 `db_default` 设置为 `default` 的值

Version 1.2.11
------------------
+ 增加 `MODEL_SET_VERBOSE_NAME_TO_DB_COMMENT`配置, 当 model 的 field 未设置 `db_comment` 时, 自动将 `db_comment` 设置为 `verbose_name` 的值
Expand Down
8 changes: 8 additions & 0 deletions docs/settings.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ Admin

设置为 ``True`` 当 model 的 field 未设置 `db_comment` 时, 自动将 `db_comment` 设置为 `verbose_name` 的值

.. setting:: MODEL_SET_VERBOSE_NAME_TO_DB_COMMENT

``MODEL_SET_DEFAULT_TO_DB_DEFAULT``
---------------------------------------------------------------
默认值: ``False``

设置为 ``True`` 当 model 的 field 未设置 `db_default` 时, 自动将 `db_default` 设置为 `default` 的值


Admin
====================
Expand Down

0 comments on commit 4417b6b

Please sign in to comment.