Требуется помощь в работе с несколькими арендаторами Django
В настоящее время я создаю saas приложение, используя django_multitenant пакет и я прочитал и следовал всем деталям, данным в документации и при использовании панели администратора Django все в порядке. Если мы создаем любой объект из панели, то объект автоматически получает назначенного ему арендатора, но при использовании API он продолжает спрашивать идентификатор арендатора, как это решить.
# 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."
]
}
При взаимодействии с конечными точками API система постоянно запрашивает ID арендатора, в отличие от панели администрирования Django, где назначение арендатора происходит автоматически. Я ожидал, что API будет обрабатывать назначение арендаторов аналогично панели администратора, не требуя явных идентификаторов арендаторов для каждого запроса.