Использование пользовательской функции внутри ModelViewset в Django rest framework
Я всегда использовал APIView для написания всех CRUD операций в одном api представлении, так как APIView уже распознает, какие действия должны быть выполнены на основе http методов, которые приходят из запроса от фронтенда.
Недавно я столкнулся с кодом, написанным с использованием ModelViewset. Здесь вместо list, create, destroy определяется пользовательская функция. Например, функция с именем **"get_all_students_questions"**
. Вот фрагмент ниже:
class QandaApiViewSet(viewsets.ModelViewSet, PusherMixin):
"""
Viewset that returns the paginated Qanda Details.
"""
queryset = Qanda.objects.all().order_by("-created_at")
serializer_class = QandaModelSerializers
def get_pusher_settings(self):
setting = Setting.objects.filter(slug="pusher").first()
if setting:
return setting.settings
return None
def create(self, request):
"""
The method that accepts the form data to save the data as
Qanda instance.
"""
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
validated_data = serializer.validated_data
image_content = validated_data.get("content")
subject = validated_data.get("subject")
"""
cms_content contains the cms data in which base64 image are converted to aws url image
and content_Writing contains the image_url to those aws url image.
"""
cms_content, content_writing = parse_image_from_editor(image_content)
new_data = {
"content": cms_content,
"content_writing": content_writing,
"subject": subject,
"student": request.user,
}
qanda = Qanda(**new_data)
qanda.save()
data = {"data": cms_content, "response": "Submitted Successfully"}
"""
Sending notification to admin side
"""
try:
# getting pusher credientals from database
pusher_client = self.get_pusher_credentials(self.get_pusher_settings())
qanda_serialized = QandaModelSerializers(qanda).data
# sending notification where expert-qa is event type
pusher_client.send_notification(
"expert-qa", json.dumps(qanda_serialized)
)
except Exception:
pass
return Response(data)
def get_student_questions(self, request, *args, **kwargs):
"""
Function that accepts the get method which returns the list of questions asked
by the particular users.
"""
queryset = self.queryset.filter(student=request.user)
serializer = self.serializer_class(queryset, many=True, read_only=True)
return Response(serializer.data)
def list(self, request, *args, **kwargs):
"""
Method that returns the list of questions.
Accepts query params subject_id
"""
subject_id = request.query_params.get("subject_id", None)
queryset = self.queryset
if subject_id:
queryset = self.queryset.filter(subject_id=subject_id)
serializer = self.serializer_class(queryset, many=True, read_only=True)
return Response(serializer.data)
В приведенном выше фрагменте мы видим такие функции, как get_student_questions и get_pusher_settings. Так можем ли мы использовать пользовательские функции с пользовательскими именами, как описано выше в ModelViewset? Если да, то как проложить маршрут к этим функциям из одной конечной точки api? url определяется следующим образом:
router = DefaultRouter()
router.register(r"question/submit", users.QandaApiViewSet)
urlpatterns = [
path(
"my-questions/list/",
users.QandaApiViewSet.as_view({"get": "get_student_questions"}),
)
]
Так когда же этот get_student_questions будет вызван из вышеупомянутого url?
Второй вопрос: можно ли использовать эти пользовательские функции в APIView так же, как в ModelViewset?