25đź‘Ť
Yeah, it is a little bit complicated.
There are a number of ways you could implement it. Basically, you need some way of indicating which models are associated with which database.
First option
Here’s the code that I use; hope it helps.
from django.db import connections
class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""
def db_for_read(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None
def db_for_write(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None
def allow_syncdb(self, db, model):
"Make sure syncdb doesn't run on anything but default"
if model._meta.app_label == 'myapp':
return False
elif db == 'default':
return True
return None
The way this works is I create a file with the name of the database to use that holds my models. In your case, you’d create a separate models
-style file called asterisk.py
that was in the same folder as the models for your app.
In your models.py
file, you’d add
from asterisk import *
Then when you actually request a record from that model, it works something like this:
records = MyModel.object.all()
- module for
MyModel
ismyapp.asterisk
- there’s a connection called “asterisk” so use
it instead of “default”
Second Option
If you want to have per-model control of database choice, something like this would work:
from django.db import connections
class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""
def db_for_read(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None
def db_for_write(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None
def allow_syncdb(self, db, model):
if hasattr(model,'connection_name'):
return model.connection_name
return None
Then for each model:
class MyModel(models.Model):
connection_name="asterisk"
#etc...
Note that I have not tested this second option.
8đź‘Ť
An addendum to Jordans answer above. For the second option, the allow_syncdb method works correctly as follows:
def allow_syncdb(self, db, model):
if hasattr(model,'connection_name'):
return model.connection_name == db
return db == 'default'
- [Django]-Django datefield filter by weekday/weekend
- [Django]-How to produce a 303 Http Response in Django?
- [Django]-Using Cloudfront with Django S3Boto
3đź‘Ť
Does the documentation on automatic database routing and manually selecting a database not help?
- [Django]-Django storages aws s3 delete file from model record
- [Django]-Sending an SMS to a Cellphone using Django
- [Django]-Django: How to format a DateField's date representation?