Как включить функциональность 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})
вот мой класс 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/