mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.0 KiB
32 lines
1.0 KiB
import json |
|
import logging |
|
import uuid |
|
from datetime import datetime |
|
|
|
from django.conf import settings |
|
from django.db import models |
|
from django.utils import timezone as dj_timezone |
|
from django.utils.translation import gettext_lazy as _ |
|
|
|
lazy_type = type(_('gettext_lazy')) |
|
|
|
|
|
class ModelJSONFieldEncoder(json.JSONEncoder): |
|
""" 解决一些类型的字段不能序列化的问题 """ |
|
|
|
def default(self, obj): |
|
str_cls = (models.Model, lazy_type, models.ImageField, uuid.UUID) |
|
if isinstance(obj, str_cls): |
|
return str(obj) |
|
elif isinstance(obj, datetime): |
|
obj = dj_timezone.localtime(obj) |
|
return obj.strftime(settings.DATETIME_DISPLAY_FORMAT) |
|
elif isinstance(obj, (list, tuple)) and len(obj) > 0 \ |
|
and isinstance(obj[0], models.Model): |
|
return [str(i) for i in obj] |
|
else: |
|
try: |
|
return super().default(obj) |
|
except TypeError: |
|
logging.error(f'Type error: {type(obj)}') |
|
return str(obj)
|
|
|