django模型類查詢結果轉字典以及時間格式化
阿新 • • 發佈:2022-03-19
模型類及資料
點選檢視程式碼
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() # 這個不會被格式化