Skip to content

Instantly share code, notes, and snippets.

@arlyon
Created April 1, 2018 11:12
Show Gist options
  • Save arlyon/59e2f580bd523196791500002750ca8c to your computer and use it in GitHub Desktop.
Save arlyon/59e2f580bd523196791500002750ca8c to your computer and use it in GitHub Desktop.
Allows composing serializers together in DRF.
def composed_serializer(serializer):
"""
A decorator which, when applied to a serializer composed of
multiple other serializers, generates a Meta that merges the fields.
:param serializer: The composed class to generate Meta for.
:return: A new class with correctly defined Meta.
"""
combined_fields = {x for x in itertools.chain(*(x.Meta.fields for x in serializer.__bases__))}
if serializer.Meta:
combined_fields |= set(serializer.Meta.fields)
class ComposedSerializer(serializer):
class Meta:
fields = tuple(combined_fields)
model = serializer.__base__.Meta.model
ComposedSerializer.__name__ = serializer.__name__
ComposedSerializer.__doc__ = serializer.__doc__
return ComposedSerializer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment