Moved model_to_dict to utils

This commit is contained in:
M1ha 2018-11-27 13:09:20 +05:00
parent d300d6e46e
commit ce1a206b04
2 changed files with 29 additions and 10 deletions

View File

@ -1,5 +1,6 @@
from django.db.models import Model as DjangoModel from django.db.models import Model as DjangoModel
from django.forms import model_to_dict
from django_clickhouse.utils import model_to_dict
class Django2ClickHouseModelSerializer: class Django2ClickHouseModelSerializer:
@ -13,13 +14,7 @@ class Django2ClickHouseModelSerializer:
self.exclude_serialize_fields = exclude_fields self.exclude_serialize_fields = exclude_fields
def serialize(self, obj): # type: (DjangoModel) -> 'ClickHouseModel' def serialize(self, obj): # type: (DjangoModel) -> 'ClickHouseModel'
# Standard model_to_dict ignores some fields if they have invalid naming data = model_to_dict(obj, fields=self.serialize_fields, exclude_fields=self.exclude_serialize_fields)
data = {}
sync_fields = set(self.serialize_fields) - set(self.exclude_serialize_fields or ())
for name in sync_fields:
val = getattr(obj, name, None)
if val is not None:
data[name] = val
# Remove None values, they should be initialized as defaults # Remove None values, they should be initialized as defaults
params = {} params = {}

View File

@ -1,10 +1,12 @@
import datetime import datetime
from typing import Union, Any, Optional, TypeVar, Set from itertools import chain
from typing import Union, Any, Optional, TypeVar, Set, Dict, Iterable
import pytz import pytz
import six import six
from importlib import import_module from importlib import import_module
from importlib.util import find_spec from importlib.util import find_spec
from django.db.models import Model as DjangoModel
from .database import connections from .database import connections
@ -97,3 +99,25 @@ def get_subclasses(cls, recursive=False): # type: (T, bool) -> Set[T]
subclasses.update(get_subclasses(subcls, recursive=True)) subclasses.update(get_subclasses(subcls, recursive=True))
return subclasses return subclasses
def model_to_dict(instance, fields=None, exclude_fields=None):
# type: (DjangoModel, Optional[Iterable[str]], Optional[Iterable[str]]) -> Dict[str, Any]
"""
Standard model_to_dict ignores some fields if they have invalid naming
:param instance: Object to convert to dictionary
:param fields: Field list to extract from instance
:param exclude_fields: Filed list to exclude from extraction
:return: Serialized dictionary
"""
data = {}
opts = instance._meta
fields = fields or {f.name for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many)}
for name in set(fields) - set(exclude_fields or set()):
val = getattr(instance, name, None)
if val is not None:
data[name] = val
return data