Django DetailView 访问 M2M 领域的用户以限制访问?

Django DetailView getting access to users in M2M field to restrict access?

我目前正在使用 DetailView,返回一些业务详细信息的 JsonResponse。我正在使用 test_funcUserPassesTestMixin 来确保只有拥有 is_admin=True 的用户才能访问这些仅限管理员的视图。

现在,在我的 BusinessDetail 模型中,我有一个名为 owner 的字段,它是一个链接到作为企业所有者的用户的 M2M 字段。当然,我还需要限制视图以确保 self.request.userBusinessDetail 模型的 owner 字段中。

我已经尝试了一些东西,包括这个...

class BusinessDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
    model = BusinessDetail

    def test_func(self):
        return self.request.user.is_admin

    def get_object(self, queryset=None):
        business = get_object_or_404(BusinessDetail, pk=self.kwargs.get('pk'))
        serialized_obj = serializers.serialize('json', [business])
        return  serialized_obj

    def get(self, request, *args, **kwargs):
        try:
            business = self.get_object()
            logger.debug(business obj: {business}')
            if self.request.user not in business.owner.all():
                logger.debug('Error: Access not granted.')
                return JsonResponse({'Error': 'Access restricted.'})
            return JsonResponse(json.loads(business), status=200, safe=False)
        except Exception as e:
            logger.error(f'Error getting business detail with error: {e}')
            return JsonResponse({'Error': 'DB error, return to previous page'}, status=500)

我的记录器看起来像...

==> /var/log/app/logger/debug.log <==
DEBUG 2020-12-08 21:35:19,935 /app_site/business_admin/views.py get 379 Business obj: [{"model": "authentication.business_detail", "pk": 3, "fields": {"name": "test name", "phone_no": "(111)-111-1111",  "street": "111 5th st, "city": "Fort Lauderdale", "state": "Florida", "zip": "33087", "primary_email": "test@aol.com", "owner": [4], }}]
ERROR 2020-12-08 21:35:19,935 /app_site/business_admin/views.py get 379 Error getting business detail with error: 'str' object has no attribute 'owner'

是否有 different/better 方法将这些视图限制为链接到 owner 字段的用户,因为我仍然无法访问您可以看到输出的 owner 字段在记录器中?我真的无法访问 owner 字段。

在此先感谢您的帮助!

您可以通过以下方式进行限制:

def get_object(self, queryset=None):
    business = get_object_or_404(
        BusinessDetail,
        pk=self.kwargs['pk'],
        <b>owner=self.request.user</b>
    )
    # …

如果登录用户不是所有者的成员,那么这将return HTTP 404 响应。

然而,您的 test_func 会将视图限制为仅 admin 用户,因此只有作为所有者的管理员用户才能看到。