django模型类查询结果转字典以及时间格式化

模型类及数据

点击查看代码
from django.db import models
from django.utils.translation import gettext_lazy as _


# Create your models here.
class HeroInfo(models.Model):
    ROLE = (
        (0, '射手'),
        (1, '辅助'),
        (2, '法师'),
        (3, '战士')
    )
    name = models.CharField(_('英雄名'), max_length=16)
    role = models.SmallIntegerField(_('定位'), choices=ROLE)
    feature = models.CharField(_('特性'), max_length=32)
    create_date = models.DateField(_('创建时间'), auto_now_add=True)

image

instanct转字典

方法1 modle_to_dict

点击查看代码
ins  = model_to_dict(HeroInfo.objects.get(id=3))
备注

这种方法不会转换editable=False属性字段的展示,对于有auto_now_add=True和auto_now=True属性的datetime字段会默认添加editable=False隐藏属性,也不会转换。

方法2 自定义to_dict

代码
点击查看代码
class HeroInfo(models.Model):
    ROLE = (
        (0, '射手'),
        (1, '辅助'),
        (2, '法师'),
        (3, '战士')
    )
    name = models.CharField(_('英雄名'), max_length=16)
    role = models.SmallIntegerField(_('定位'), choices=ROLE)
    feature = models.CharField(_('特性'), max_length=32)
    create_date = models.DateTimeField(_('创建时间'), auto_now_add=True)
    create_date1 = MyDateTimeField(_('test'), auto_now_add=True)

    def to_dict(self, fields=None, exclude=None):
        data = {}
        for f in self._meta.concrete_fields + self._meta.many_to_many:
            value = f.value_from_object(self)
            if fields and f.name not in fields:
                continue
            if exclude and f.name in exclude:
                continue
            if isinstance(f, models.ManyToManyField):
                value = [i.id for i in value] if self.pk else None
            if isinstance(f, models.DateTimeField):
                value = value.strftime('%Y-%m-%d %H:%M:%S') if value else None
            data[f.name] = value
        return data

执行结果

image

query_set转字典

方法1 .values()

代码
点击查看代码
 hiv = HeroInfo.objects.values()
执行结果

image

方法2 pickle

代码
点击查看代码
from app01.models import HeroInfo
import pickle

qs = HeroInfo.objects.values_list('id', 'name', 'role')
reloaded_qs = HeroInfo.objects.all()
reloaded_qs.query = pickle.loads(pickle.dumps(qs.query))
reloaded_qs
执行结果

image

备注

如果要输出所有字段,在values_list方法设置参数flat为True(HeroInfo.objects.values_list(flat=True))

时间格式化

方法1 查询的时候格式化

代码
点击查看代码
HeroInfo.objects.filter(id=4).values('name', 'create_date')                           
HeroInfo.objects.filter(id=4).extra(select={"create_date": "DATE_FORMAT(create_date,'%%Y-%%m-%%d %%H:%%i:%%s')"}).values('name', 'create_date')  

执行结果

image

备注

注意要在values()中指定输出时间字段,不然不会被格式化。
HeroInfo.objects.extra(select={"create_date": "DATE_FORMAT(create_date,'%%Y-%%m-%%d %%H:%%i:%%s')"}).values() # 这个不会被格式化

posted @ 2022-03-19 16:45  一枚码农  阅读(858)  评论(0编辑  收藏  举报