Search code examples
pythondjangotastypie

Dynamically create Resources for multiple django models in tastypie


I need to expose multiple existing django models to tastypie. I got the basics covered with creating af ModelResource and registering it in urls.py. However, I would like to avoid writing Resource classes for every django model and since they all need to work the same way, I would like to have it generalised in some way.

So basically what I hope to archive is with a set of regular django models:

class ModelA:
  field1 = ...
  field2 = ...

class ModelB:
  field3 = ...
  field4 = ...

class ModelC:
  field8 = ...
  field9 = ...

And then automatically have them exposed to tastypie API as '/api/v1/modela/', '/api/v1/modelb/' and '/api/v1/modelc/ and so forth.

Not looking for a complete solution, just suggestions for a good approach to this.


Solution

  • A Resource is 'just' a python class so you could simply create a base resource and inherit it with only the queryset and resource_name Meta attributes defined.

    You could probably automate naming too by fiddling with the Resource class's __new__ method or create a custom classmethod, but I'm not sure the effort will gain you much.

    Registering the classes to the api can be automated in numerous ways, of which one could be:

    for name, obj in inspect.getmembers(sys.modules['resources']):
        if inspect.isclass(obj):  # might want to add a few exclusions
            v1_api.register(obj())
    

    where 'resources' is the name of the module containing resources, but this is kind of implicit..