我已经根据用户角色为我的 Django Web 应用程序创建了全局搜索功能。 但是不是在每个模型中添加权限,而是如何制作一个通用功能并将其添加到每个模型中以获得API。您的建议和指南将不胜感激。 请帮我解决这个问题。
提前致谢。
from django . shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
# Create your views here.
from apps. events.models import Event
from apps. events.serializers import EventSerializer
from apps. inquiry. models import Newinquiry, from apps. inquiry.serializers import NewinquirySerializer
from apps.customer_po.models import PoDetail
from apps.customer_po.serializers import POSerializer
from apps.customer.models import Customer
from apps.customer.serializers.customer import CustomerSerializer
from django .db.models import Q
class SearchView(APIView):
def get(self, request):
user = self.request.user
data = {}
q = request.GET.get('q','')
customer_obj = Customer.objects.filter(Q(customer__icontains=q) | Q(country__icontains=q) | Q (industry__industry__icontains=q) | Q(location__icontains=q) | Q(outcome__icontains=q) | Q(contact_person__icontains=q))
data['customers'] = CustomerSerializer(customer_obj, many=True, context={'request': request}).data
if user.groups.name in ['CEO', 'Admin']:
resp = {'data':CustomerSerializer(Customer.objects.all(), many=True).data}
elif user.groups.name == 'Manager':
resp = {'data':CustomerSerializer(Customer.objects.filter( Q(created_by=user) |
Q(created_by__reports_to=user) ), many=True).data}
else:
resp = {'data':CustomerSerializer(Customer.objects.filter(assigned_to=user), many=True).data}
return Response(resp, status=status.HTTP_200_OK)
# events_obj = Event.objects.filter(Q(status_type__icontains=q) | Q(customer_name__customer__icontains=q) | Q(activity_type__icontains=q) | Q(priority_type__icontains=q) | Q(visibility_type__icontains=q) | Q(organization_type__icontains=q) |Q(contact_name__icontains=q) | Q(location__icontains=q) | Q(subject__icontains=q))
# data['events'] = EventSerializer(events_obj, many=True, context={'request': request}).data
# if user.groups.name in ['CEO', 'Admin']:
# resp = {'data':EventSerializer(Event.objects.all(), many=True).data}
# elif user.groups.name == 'Manager':
# resp = {'data':EventSerializer(Event.objects.filter( Q(created_by=user) | Q(created_by__reports_to=user) ), many=True).data}
# else:
# resp = {'data':EventSerializer(Event.objects.filter(assigned_to=user), many=True).data}
# return Response(resp, status=status.HTTP_200_OK)
# inquiry_obj = Newinquiry.objects.filter(Q(customername__icontains=q) | Q(types__icontains=q) | Q(region__icontains=q) |Q(owner__icontains=q) | Q(irr_no__icontains=q) | Q(contactperson__icontains=q) | Q(targetdate__icontains=q) | Q(briefinquirydescription__icontains=q))
# data['inquirys'] = NewinquirySerializer(inquiry_obj, many=True, context={'request': request}).data
# if user.groups.name in ['CEO', 'Admin']:
# resp1 = {'data':NewinquirySerializer(Newinquiry.objects.all(), many=True).data}
# elif user.groups.name == 'Manager':
# resp1 = {'data':NewinquirySerializer(Newinquiry.objects.filter( Q(created_by=user) | Q(created_by__reports_to=user) ), many=True).data}
# else:
# resp1 = {'data':NewinquirySerializer(Newinquiry.objects.filter(assigned_to=user), many=True).data}
# return Response(resp1, status=status.HTTP_200_OK)
# customer_po_obj = PoDetail.objects.filter(Q(customer_name__customer__icontains=q) | Q(region__icontains=q) | Q(designer_name__icontains=q) | Q(po_no__icontains=q) | Q(quotation_no__icontains=q) | Q(place_of_delivery__icontains=q) | Q(ssi_no__icontains=q) | Q(invoice_to__icontains=q) | Q(consignee__icontains=q))
# data['customer_po'] = POSerializer(customer_po_obj,many=True,context={'request':request}).data
# if user.groups.name in ['CEO', 'Admin']:
# resp2 = {'data':PoSerializer(PoDetail.objects.all(), many=True).data}
# elif user.groups.name == 'Manager':
# resp2 = {'data':PoSerializer(PoDetail.objects.filter( Q(created_by=user) | Q(created_by__reports_to=user) ), many=True).data}
# else:
# resp2 = {'data':PoSerializer(PoDetail.objects.filter(assigned_to=user), many=True).data}
# return Response(resp2, status=status.HTTP_200_OK)
return Response(data)