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.