Queryset optimization supports for multi database spanning relations between Django models.
- Python (>= 3.5)
- Django (>= 1.10)
pip install django-multi-db-relationFor models
class ModelA(models.Model):
name = models.CharField(max_length=10)
class ModelB(models.Model):
a = models.ForeignKey(ModelA, on_delete=models.DO_NOTHING)
class ModelC(models.Model):
b = models.ForeignKey(ModelB, on_delete=models.DO_NOTHING, db_constraint=False)suppose that ModelA and ModelB is routed to db1 and ModelC to db2.
We cannot run a queryset with select_related().
>>> ModelC.objects.select_related('b') # Table not foundIn this case, modify ModelC like:
from multi_db_relation.mixins import ExternalDbQuerySetMixin
class ModelCQuerySet(ExternalDbQuerySetMixin, models.QuerySet):
pass
class ModelC(models.Model):
b = models.ForeignKey(ModelB, on_delete=models.DO_NOTHING, db_constraint=False)
objects = models.Manager.from_queryset(queryset_class=ModelCQuerySet)()
class Meta:
external_db_fields = ['b']then:
>>> ModelC.objects.select_related('b') # Number of queries is optimized from O(n) to O(1)
>>> ModelC.objects.select_related('b__a') # Also works well- See LICENSE