Django multi tenant help required

31 Views Asked by At

I am currently building saas app using django_multitenant package and i read and followed all the detail given in the docs and while using Django admin panel everything is fine. If we create any object from panel the object automatically get tenant assigned to it but while using an API and It kept asking the tenant id how to solve it.

# setting 
MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "apps.api_auth.middlewares.MultitenantMiddleware",
    # 'django_multitenant.middlewares.MultitenantMiddleware',
]

# custom middleware
class MultitenantMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        jwt_auth = JWTAuthentication()
        # Authenticate the user
        auth_result = jwt_auth.authenticate(request)

        if auth_result is not None:
            user, _ = auth_result
            if user and not user.is_anonymous:
                tenant = Institute.objects.filter(user=user).first()
                set_current_tenant(tenant)
        response = self.get_response(request)
        unset_current_tenant()
        return response

# models
class Institute(TenantModel):
    name = models.CharField(max_length=100)

    class TenantMeta:
        tenant_field_name = "id"


class CustomUserManager(TenantManagerMixin, UserManager):
    pass


class User(TenantModel, AbstractUser):
    institute = TenantForeignKey(
        "tenant.institute", on_delete=models.CASCADE, blank=True, null=True
    )

    objects = CustomUserManager()

    class TenantMeta:
        tenant_field_name = "institute_id"


class SessionYear(TenantModel):
    start_year = models.DateField()
    end_year = models.DateField()
    is_deleted = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    institute = TenantForeignKey("tenant.institute", on_delete=models.CASCADE)

    class TenantMeta:
        tenant_field_name = "institute_id"

# API view
from django_multitenant import views
from rest_framework import viewsets, permissions

from apps.tenant import tenant_func
from apps.tenant.models.institute import Institute

from ..models import SessionYear
from ..serializers.session_year import AdminSessionYearSerializer
from django_multitenant.utils import get_current_tenant

views.get_tenant = tenant_func.tenant_func


class SessionYearViewSet(views.TenantModelViewSet):
    model_class = SessionYear
    serializer_class = AdminSessionYearSerializer
    permission_classes = [permissions.IsAuthenticated]

#Serializer
from rest_framework import serializers

from ..models import SessionYear


class AdminSessionYearSerializer(serializers.ModelSerializer):
    class Meta:
        model = SessionYear
        fields = "__all__"


# postman
# POST
{
    "institute": [
        "This field is required."
    ]
}

When interacting with API endpoints, the system consistently requests the tenant ID, unlike when using the Django admin panel where tenant assignment is automatic. I expected the API to handle tenant assignment similarly to the admin panel, without requiring explicit tenant IDs for each request.

0

There are 0 best solutions below