Django-tenants:访问公共域中的租户数据

问题描述 投票:0回答:1

我正在开发 Django-tenant,其中有一个名为 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...

如果我将模板留空,则不会显示错误 是我缺少的东西吗??

我正在尝试获取公共领域中的特定租户模型数据

django multi-tenant django-tenants
1个回答
0
投票

查询集是惰性的,这意味着您可以在打印语句中看到的查询集中的实际模型实例当时实际上并未加载到内存中。

再加上架构上下文不会传递到模板引擎,这意味着当模板尝试访问查询集中的项目时,它会使用公共实例使用的任何架构来执行此操作。租户模型不存在于公共模式中,这会导致您看到的错误。

修复:强制评估查询集以强制其元素,并在架构上下文块内执行此操作。

例如:

with schema_context(self.schema_name):
    ...
    list(context['appointments'] = Appointment.objects.all())

注意!请注意,这意味着模板只能访问评估时明确包含在查询集中的数据。也就是说,如果您这样做,则无法遍历模板内的关系,因为这需要模板引擎进行数据库调用(导致与原始错误相同的架构问题)。

因此请确保您的查询集显式包含模板所需的所有必需数据。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.