Вопрос о принципах работы сериализаторов и представлений в Django rest framework

Я пытаюсь построить REST api с помощью Django Rest Framework и испытываю трудности с пониманием того, как вещи связаны друг с другом в плане того, когда нам нужно использовать пользовательские функции.

У меня views.py вот так

class myAPIView(viewsets.ModelViewSet):
    queryset = myTable.objects.all()
    serializer_class = mySerializer

это моя serializer.py

class myserializer(serializers.ModelSerializer):
    
    class Meta:
        model = myTable
        fields = "__all__"

    def create(self, validated_data):
        #doing some operation here and save validated data

    def update(self, instance, validated_data):    
        #doing some operation here and save validated data

Я хочу добавить некоторую пользовательскую функцию, чтобы сделать, скажем, отправку электронной почты с обработанными данными. Когда я добавляю функцию my_email_sender, ничего не происходит (ничего не выводится в терминал).

class myAPIView(viewsets.ModelViewSet):
        queryset = myTable.objects.all()
        serializer_class = mySerializer
    
    def my_email_func():
       print("Hey I'm email function")
       my_email_sender()

OTH, когда вы делаете это внутри serializer его печать на экран.

Я действительно не знаю, что это my_email_func должно быть внутри views.py какой-то CRUD операционной функции, как def create(), def update() etc... Я также не знаю, почему мы не можем вызвать ее из views.py? Заранее благодарю за ответ!

Вам просто нужно создать функцию get и вызвать внутри нее свою функцию

должно быть что-то вроде этого:

class myAPIView(viewsets.ModelViewSet):
        queryset = myTable.objects.all()
        serializer_class = mySerializer
    
    def my_email_func():
       print("Hey I'm email function")
       my_email_sender()
  
    def get(self, request, *args, **kwargs):
       my_email_func()
       return Response(status=status.HTTP_200_OK)

и затем создайте URL в urls.py, который ссылается на это представление, и вызовите конечную точку методом get из postman или браузера

Надеюсь, это решит вашу проблему!

Вернуться на верх