Skip to content

Instantly share code, notes, and snippets.

@iurisilvio
Created September 21, 2020 13:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iurisilvio/78241493d5c596b1941d50d19c982d66 to your computer and use it in GitHub Desktop.
Save iurisilvio/78241493d5c596b1941d50d19c982d66 to your computer and use it in GitHub Desktop.
django serialization hack
from django.db import models
from django.db.models.query import ModelIterable
class BaseSerializer:
SELECT_RELATED = []
PREFETCH_RELATED = []
def prepare_queryset(self, qs):
if self.SELECT_RELATED:
qs = qs.select_related(*self.SELECT_RELATED)
if self.PREFETCH_RELATED:
qs = qs.prefetch_related(*self.PREFETCH_RELATED)
return qs
def prepare_object(self, obj):
obj.serialize = lambda: self.serialize(obj)
def serialize(self, obj):
return obj.to_dict_json()
class _SerializableModelIterable(ModelIterable):
@classmethod
def factory(cls, serializer):
def new(*args, **kwargs):
self = cls(*args, **kwargs)
self._serializer = serializer
return self
return new
def __iter__(self):
for obj in super().__iter__():
self._serializer.prepare_object(obj)
yield obj
class SerializableQuerySet(models.QuerySet):
def to_serialize(self, serializer_cls):
serializer = serializer_cls()
self._iterable_class = _SerializableModelIterable.factory(serializer)
return serializer.prepare_queryset(self)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment