def allow_relation(self, obj1, obj2, **hints): """ Only allow relationships between two items which are both on only one database or between sharded items on the same shard. """ object1_databases = get_possible_databases_for_model(model=obj1._meta.model) object2_databases = get_possible_databases_for_model(model=obj2._meta.model) if (len(object1_databases) == len(object2_databases) == 1) and (object1_databases == object2_databases): return True return self.get_shard_for_instance(obj1) == self.get_shard_for_instance(obj2)
def db_for_write(self, model, **hints): possible_databases = get_possible_databases_for_model(model=model) if len(possible_databases) == 1: return possible_databases[0] shard = self._get_shard(model, **hints) if shard: db_config = settings.DATABASES[shard] return db_config.get('PRIMARY', shard) return None
def get_shards(model): """ Get shards(only primary db). """ shards = [] for s in get_possible_databases_for_model(model): db_config = settings.DATABASES[s] if db_config.get('PRIMARY') is None: shards.append(s) return shards
def db_for_read(self, model, **hints): possible_databases = get_possible_databases_for_model(model=model) if len(possible_databases) == 1: return possible_databases[0] shard = self._get_shard(model, **hints) if shard: shard_group = getattr(model, 'django_sharding__shard_group', None) if not shard_group: raise DjangoShardingException('Unable to identify the shard_group for the {} model'.format(model)) routing_strategy = self.get_read_db_routing_strategy(shard_group) return routing_strategy.pick_read_db(shard) return None