Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django models across multiple projects/microservices. How to?

I'm wondering how to solve sharing of the model structure between multiple (separated) django projects/microservices. Eg:

  1. Project: API
  2. Project: Users dashboard
  3. Project: Admin dashboard
  4. Project: Statistics

Each of that projects uses the same django models. Is there a one, proper way to solve that?

like image 371
User Avatar asked Feb 13 '16 11:02

User


2 Answers

Django basic idea is to couple the entire app functionality together, but this does not hold in your case. It's a style and opinion question, here is what I did in a similar situation.

Split the app functionality into two project lairs:

mysite
   |
   | - db_access
   |         | --- app1
   |                 | ---- models.py
   |                 | ---- db_api.py
   |         | --- app2
   |                 | ---- models.py
   |                 | ---- db_api.py
   | - service
   |         | --- app1
   |                 | ---- urls.py
   |                 | ---- views.py
   |         | --- app2
   |                 | ---- urls.py
   |                 | ---- views.py

The db_access part has the models, and db_api.py has the queries, get objects etc, so you don't query the models, but the db_api.

Instead of

item = app1.models.Items.objects.get(user=request.user)

Use

item = app1.db_api.get_first_item(user=request.user)

This style lets you share the db & models access together, while each service consumes what it needs, and then use it for API, website etc. If a service consumes some data in a way that other services don't (and will not) use, then put this query in the service code, otherwise in the db_api.py.

This is more like a traditional laired application, but it works.

Another thing, the same project can use two git repositories, one for the db_access (which all services pull), and one for the specific service. So each django project is actually the db_access repo, and the service repo - wsgi doesn't care, of course, if the project code comes from two repositories.

like image 146
Aviah Laor Avatar answered Sep 23 '22 16:09

Aviah Laor


Two potential options:

Option 1 - Use a common codebase and deploy multiple instances of it (one for each microservice). You could follow 12factor Apps Methodology and just load a different set of environment variables for each deployed instance. http://12factor.net/

Option 2 - Split your django code up into self contained applications then have a project for each microservice that just includes these projects and a url config.

I can expand further if this is helpful?

like image 43
xxx Avatar answered Sep 20 '22 16:09

xxx