serializers.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. class Subsettable(object):
  2. @classmethod
  3. def subset(cls, *fields):
  4. fields_in_name = [f.title().replace('_', '') for f in fields]
  5. name = '{}{}Subset'.format(cls.__name__, ''.join(fields_in_name)[:100])
  6. class Meta(cls.Meta):
  7. pass
  8. Meta.fields = tuple(fields)
  9. return type(name, (cls,), {
  10. 'Meta': Meta
  11. })
  12. @classmethod
  13. def subset_exclude(cls, *fields):
  14. final_fields = []
  15. for field in cls.Meta.fields:
  16. if field not in fields:
  17. final_fields.append(field)
  18. fields_in_name = [f.title().replace('_', '') for f in final_fields]
  19. name = '{}{}Subset'.format(cls.__name__, ''.join(fields_in_name)[:100])
  20. class Meta(cls.Meta):
  21. pass
  22. Meta.fields = tuple(final_fields)
  23. return type(name, (cls,), {
  24. 'Meta': Meta
  25. })
  26. @classmethod
  27. def subset_extend(cls, *fields):
  28. final_fields = list(cls.Meta.fields)
  29. for field in fields:
  30. if field not in final_fields:
  31. final_fields.append(field)
  32. fields_in_name = [f.title().replace('_', '') for f in final_fields]
  33. name = '{}{}Subset'.format(cls.__name__, ''.join(fields_in_name)[:100])
  34. class Meta(cls.Meta):
  35. pass
  36. Meta.fields = tuple(final_fields)
  37. return type(name, (cls,), {
  38. 'Meta': Meta
  39. })