Как включить функциональность Run в мой API в Django?

Я работаю над проектом Django, в котором мне нужно сделать API. В моем обычном Django у меня есть одна функциональность под названием Run, которую я хочу добавить в мой API View. Вот моя модель

class Robot(models.Model):
    robot = models.CharField(max_length=100)
    short_Description = models.CharField(max_length=200)
    status = models.CharField(max_length=20)
    parameter = models.CharField(max_length=200)
    jenkins_job = models.CharField(max_length=100, default='JenkinsJobName')
    jenkins_token = models.CharField(max_length=100, default='JenkinsToken')
    jenkins_build = models.CharField(max_length=10, default=0)
    jenkins_build_status = models.CharField(max_length=20, default="Never Run")
    def __str__(self):
        return self.robot

class assignParameter(models.Model): 
    parameterName = models.CharField(max_length=100, blank=True)
    assignRobot= models.ForeignKey(Robot, on_delete=models.CASCADE, related_name='param', blank=True, null=True)

вот мой serializer.py

from .models import Robot,assignParameter
from rest_framework import serializers

class assignParameterSerializer(serializers.ModelSerializer):
    class Meta: 
        model = assignParameter
        fields = ['id', 'parameterName', 'assignRobot']

class RobotSerializer(serializers.ModelSerializer):
    param = assignParameterSerializer(many=True, read_only=True)
    class Meta: 
        model = Robot
        fields = ['id', 'robot', 'short_Description', 'status', 'parameter', 'jenkins_job', 'jenkins_token', 'jenkins_build', 'jenkins_build_status','param']

вот моя обычная функция запуска

def Run_data(Request,id):
    if Request.method == 'POST':
        pi = Robot.objects.get(pk=id)
        jenkinsJob = list(Robot.objects.values('jenkins_job').get(pk=id).values())[0]
        jenkinsToken = list(Robot.objects.values('jenkins_token').get(pk=id).values())[0]
        fm = RobotReg(Request.POST, instance=pi)
        out = fm.data
        robot_params = list(dict(out).values())
        node = robot_params.pop(1)[0]
        url = list(Lookup.objects.values('Value').filter(Type='JENKINS_URL').values())[0].get('Value') 
        Uipath = list(Lookup.objects.values('Additionalinfo').filter(Type='JENKINS_NODES',Value=node).values())[0].get('Additionalinfo')
        robotexe = list(Lookup.objects.values('Value').filter(Type='ROBOT_EXE_PATH',Additionalinfo=node).values())[0].get('Value') 
        robot_params.append(['node', node])
        robot_params.append(['Uipath', Uipath])
        robot_params.append(['robotexe', robotexe])
        params_count = len(robot_params)
        params_exist = len(robot_params[1][0])
        params = ""
        urlFinal = ""
        # url = Lookup.objects.filter(Type="JENKINS_URL").values_list(Value) 
        
        if params_count > 0:
            for i in range(params_count-1):
                params = params + robot_params[i+1][0] + '=' + robot_params[i+1][1] + '&'
            url = url + jenkinsJob + "/buildWithParameters?" 
        else:
            url = url + jenkinsJob + "/build?"
 
        urlFinal = url + params + 'token=' + jenkinsToken
        print(urlFinal, flush=True)
        resp = requests.post(urlFinal)
        if resp:
            messages.info(Request, "Success! Robot is being run")
        else:
            messages.info(Request, "Failed! Robot could not be run")
 
        if fm.is_valid():
            fm.save()
            fm = RobotReg()
        return HttpResponseRedirect('/dashboard')
            
    else:
        pi = Robot.objects.get(pk=id)
        fm = RobotReg(instance=pi) 
        param = list(assignParameter.objects.values('parameterName').filter(assignRobot=pi))
    rob = Robot.objects.all()  
    lup = Lookup.objects.all()   
    return render(Request, 'hello/runrobot.html', {'form': fm, 'robot': rob,'Lookup' : lup,'parameter' : param})

и вид этой функции Run enter image description here

вот мой класс API

class RobotViewSet(ListAPIView):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    # filter_backends = [DjangoFilterBackend]
    # filterset_fields = ['robot']
    filter_backends = [SearchFilter]
    search_fields = ['robot']
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticatedOrReadOnly]

Теперь в API классе типа crud operation как добавить эту функциональность Run?

Вот что я предлагаю, если я правильно понял:

  • Создайте набор представлений ModelViewSet или, если вы хотите ограничить CRUD действием list, создайте набор представлений из GenericViewSet, ListMixin
  • .
  • Добавьте новое действие в набор представлений как детальное действие
  • .
  • Заведите своего робота и запустите свой метод

Пример:

class RobotViewSet(mixins.ListModelMixin,
                   GenericViewSet):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    # filter_backends = [DjangoFilterBackend]
    # filterset_fields = ['robot']
    filter_backends = [SearchFilter]
    search_fields = ['robot']
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticatedOrReadOnly]

    @action(methods=["post"], detail=True)
    def run(self, request, pk=None):
        robot = self.get_object()
        # If you expect specific parameters, make a serializer
        serializer = MyRobotRunSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # Then call your run function with your desired params
        # Maybe make it a method in your model so you can call robot.run(params)

Убедитесь, что вы зарегистрировали свой набор представлений в URL-адресах с помощью Router

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register("robots", RobotViewSet, "robots")

urlpatterns = [
    path("api/", include(router.urls), name="api"),
]

Затем просто выполните POST-запрос, например api/robots/1/run/

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