citusdata/django-multitenant

Redundant queries when using related managers

GuySharir opened this issue · 0 comments

When trying to access objects through the related manager there are N extra queries that are performed that are unnecessary.
The problem is at __setattr__, specifically at is_val_equal_to_tenant (code).
The problen is that when we try to check the equality of val and self.tenant_object we perform another DB call to fetch the tenant.

reproduce:

from django_multitenant.tests.base import BaseTestCase
from django_multitenant.tests.models import Project


class RelatedMangerTestCase(BaseTestCase):
    def test(self):
        account = self.account_fr
        _proj_1 = Project.objects.create(name="project_1", account=account)
        _proj_2 = Project.objects.create(name="project_2", account=account)

        with self.assertNumQueries(1):
            # This will fail, the actual amount of queries is 3
            # 1 for the SELECT query to get the projects
            # and then 2 more queries to fetch the tenant 1 for each project
            list(account.projects.all())
First expected query
SELECT
  "tests_project"."id",
  "tests_project"."name",
  "tests_project"."account_id",
  "tests_project"."employee_id"
FROM
  "tests_project"
WHERE
  "tests_project"."account_id" = 1
Extra queries This query will be executed once for each related object (in this case 2 times) so when we have N related objects we will result in N extra queries.
SELECT
  "tests_account"."id",
  "tests_account"."name",
  "tests_account"."domain",
  "tests_account"."subdomain",
  "tests_account"."country_id",
  "tests_account"."employee_id"
FROM
  "tests_account"
WHERE
  "tests_account"."id" = 1
LIMIT
  21