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)
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
执行结果
query_set转字典
方法1 .values()
代码
点击查看代码
hiv = HeroInfo.objects.values()
执行结果
方法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
执行结果
备注
如果要输出所有字段,在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')
执行结果
备注
注意要在values()中指定输出时间字段,不然不会被格式化。
HeroInfo.objects.extra(select={"create_date": "DATE_FORMAT(create_date,'%%Y-%%m-%%d %%H:%%i:%%s')"}).values() # 这个不会被格式化