前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >model_to_dict datetime 不转换

model_to_dict datetime 不转换

原创
作者头像
刀枪不入de王二花
修改2022-08-15 12:38:48
8720
修改2022-08-15 12:38:48
举报
文章被收录于专栏:BETTER

問題:

Django model_to_dict skips all DateTimeField when converting models

原因:

  • model定义时,updated_at, created_at 添加了auto_now,auto_now_add
  • auto_nowauto_now_add设置为True,将导致该字段设置为editable=Falseblank=True

解决方案:

重写(自定义)model_to_dict

详细:

model 定义参照

代码语言:javascript
复制
class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='登録日時')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新日時')

django自带model_to_dict定义参照

代码语言:python
代码运行次数:0
复制
# 调用时导入
from django.forms.models import model_to_dict

# 定义参照
def model_to_dict(instance, fields=None, exclude=None):
    """
    Return a dict containing the data in ``instance`` suitable for passing as
    a Form's ``initial`` keyword argument.

    ``fields`` is an optional list of field names. If provided, return only the
    named.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named from the returned dict, even if they are listed in the ``fields``
    argument.
    """
    opts = instance._meta
    data = {}
    for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
        if not getattr(f, 'editable', False):   # 这里导致updated_at被跳过
            continue
        if fields is not None and f.name not in fields:
            continue
        if exclude and f.name in exclude:
            continue
        data[f.name] = f.value_from_object(instance)
    return data

重写model_to_dict,(或者别名)自定义方法

注:若重写该方法,调用时,要import自定义的方法。

代码语言:python
代码运行次数:0
复制
# 重写 model_to_dict
# 形参添加 has_editable,默认True
# 调用时:from .util.convert import model_to_dict

>pj>util>convert.py
    
def model_to_dict(instance, fields=None, exclude=None, has_editable=True):
    '''
        model to dict。

        Args: 
            instance: model
            fields: プロパティを指定する
            exclude: プロパティを除外する
            has_editable: 自動更新も含めて処理する
        return: 
            dict
    '''
    opts = instance._meta
    
    data = {}
    for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
        if not has_editable and not getattr(f, "editable", False):
            # 若不处理自己动更新字段,则跳过
            continue
        if fields is not None and f.name not in fields:
            continue
        if exclude and f.name in exclude:
            continue
        data[f.name] = f.value_from_object(instance)
    return data

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 問題:
  • 原因:
  • 解决方案:
  • 详细:
    • model 定义参照
      • django自带model_to_dict定义参照
        • 重写model_to_dict,(或者别名)自定义方法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档