mirror of
https://github.com/django/django.git
synced 2024-11-28 02:27:42 +01:00
bed504d70b
The new signature enables better support for routing RunPython and RunSQL operations, especially w.r.t. reusable and third-party apps. This commit also takes advantage of the deprecation cycle for the old signature to remove the backward incompatibility introduced in #22583; RunPython and RunSQL won't call allow_migrate() when when the router has the old signature. Thanks Aymeric Augustin and Tim Graham for helping shape up the patch. Refs 22583.
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from django.db import DEFAULT_DB_ALIAS
|
|
|
|
|
|
class TestRouter(object):
|
|
"""
|
|
Vaguely behave like primary/replica, but the databases aren't assumed to
|
|
propagate changes.
|
|
"""
|
|
|
|
def db_for_read(self, model, instance=None, **hints):
|
|
if instance:
|
|
return instance._state.db or 'other'
|
|
return 'other'
|
|
|
|
def db_for_write(self, model, **hints):
|
|
return DEFAULT_DB_ALIAS
|
|
|
|
def allow_relation(self, obj1, obj2, **hints):
|
|
return obj1._state.db in ('default', 'other') and obj2._state.db in ('default', 'other')
|
|
|
|
def allow_migrate(self, db, app_label, **hints):
|
|
return True
|
|
|
|
|
|
class AuthRouter(object):
|
|
"""
|
|
Control all database operations on models in the contrib.auth application.
|
|
"""
|
|
|
|
def db_for_read(self, model, **hints):
|
|
"Point all read operations on auth models to 'default'"
|
|
if model._meta.app_label == 'auth':
|
|
# We use default here to ensure we can tell the difference
|
|
# between a read request and a write request for Auth objects
|
|
return 'default'
|
|
return None
|
|
|
|
def db_for_write(self, model, **hints):
|
|
"Point all operations on auth models to 'other'"
|
|
if model._meta.app_label == 'auth':
|
|
return 'other'
|
|
return None
|
|
|
|
def allow_relation(self, obj1, obj2, **hints):
|
|
"Allow any relation if a model in Auth is involved"
|
|
if obj1._meta.app_label == 'auth' or obj2._meta.app_label == 'auth':
|
|
return True
|
|
return None
|
|
|
|
def allow_migrate(self, db, app_label, **hints):
|
|
"Make sure the auth app only appears on the 'other' db"
|
|
if app_label == 'auth':
|
|
return db == 'other'
|
|
return None
|
|
|
|
|
|
class WriteRouter(object):
|
|
# A router that only expresses an opinion on writes
|
|
def db_for_write(self, model, **hints):
|
|
return 'writer'
|