Django-арендатор: Доступ к данным арендатора в открытом доступе
Я работал над Django-арендой, где у меня есть модель арендатора под названием Appointment, теперь я хочу получить назначение конкретного арендатора из публичного домена, но у меня возникла проблема при отображении его в шаблоне
class OrganizationAppointmentList(LoginRequiredMixin, TenantMixin, ListView):
template_name = 'main/appointments/list_appointment.html'
paginate_by = 10
def get_queryset(self):
tenant_id = self.kwargs.get('pk')
try:
tenant = Organization.objects.get(id=tenant_id)
self.schema_name = tenant.schema_name
with schema_context(self.schema_name):
queryset = Appointment.objects.all()
return queryset
except Organization.DoesNotExist:
raise Http404("Tenant not found")
except Exception as e:
raise Http404(f"Error accessing tenant data: {e}")
def paginate_queryset(self, queryset, page_size):
with schema_context(self.schema_name):
return super().paginate_queryset(queryset, page_size)
def get_context_data(self, **kwargs):
with schema_context(self.schema_name):
context = super().get_context_data(**kwargs)
tenant_id = self.kwargs.get('pk')
context['tenant_id'] = tenant_id
context['appointments'] = Appointment.objects.all()
print(context['appointments'])
return context
В приведенном выше коде print(context['appointments']) выдает точные данные, но при рендеринга в шаблоне он показывает
relation "appointment_app_appointment" does not exist
LINE 1: ...app_appointment"."al_appointment_updated_at" FROM "appointme...
а если я оставляю шаблон пустым, то ошибка не появляется может я что-то упускаю?
Я пытаюсь получить данные модели конкретного арендатора в открытом доступе
Querysets are lazy, что означает, что реальные экземпляры модели внутри queryset, которые вы можете увидеть в операторе печати, на самом деле не загружаются в память в это время.
Это, в сочетании с тем фактом, что контекст схемы не передается шаблонизатору, означает, что когда шаблон пытается получить доступ к элементам из набора запросов, он делает это с той схемой, которую использует публичный экземпляр. Модель арендатора не существует в публичной схеме, что и приводит к появлению ошибки, которую вы видите.
Исправление: Принудительно оценивайте кверисет, чтобы принудительно добавить в него элементы, и делайте это внутри блока контекста схемы.
Например:
with schema_context(self.schema_name):
...
list(context['appointments'] = Appointment.objects.all())
NB! Имейте в виду, что это означает, что шаблон может обращаться только к данным, явно содержащимся в наборе запросов на момент оценки. Это означает, что вы не можете обращаться к отношениям внутри шаблона, поскольку это требует от шаблонизатора обращений к базе данных (что приводит к тем же проблемам со схемой, что и в случае с исходной ошибкой).
Поэтому убедитесь, что ваш набор queryset явно содержит все необходимые данные, которые нужны шаблону.