1. 程式人生 > 其它 >django模型類查詢結果轉字典以及時間格式化

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() # 這個不會被格式化