Наборы представлений Django Rest Framework удаляют вложенные ресурсы из отношений - PullRequest
0 голосов
/ 29 января 2019

Я создаю API с приложениями и серверами.Приложение может иметь много серверов, а сервер может иметь много приложений.

Это мои модели.

class Server(Model):
    name = TextField(unique=True)
    description = TextField(blank=True)
    ip_address = TextField()

    class Meta:
        ordering = ["name"]

    def __str__(self):
        return self.name


class Application(Model):
    name = TextField(unique=True)
    description = TextField()
    is_critical = BooleanField()
    servers = ManyToManyField(Server, related_name="applications")

    class Meta:
        ordering = ["name"]

    def __str__(self):
        return self.name

Это мои сериализаторы.

class ServerSerializer(ModelSerializer):

    class Meta:
        model = Server
        fields = "__all__"

class ApplicationSerializer(ModelSerializer):

    servers = ServerSerializer(many=True, read_only=True)    

    class Meta:
        model = Application
        fields = "__all__"

Я использую DRF Viewsets.

class ServerViewSet(ModelViewSet):
    queryset = Server.objects.all()
    serializer_class = ServerSerializer

class ApplicationViewSet(ModelViewSet):
    queryset = Application.objects.all()
    serializer_class = ApplicationSerializer

    @action(detail=True, methods=["HEAD", "GET", "POST", "DELETE"])
    def servers(self, request, pk=None):
        """Relate a server to the application"""

        application = self.get_object()

        if request.method in ("HEAD", "GET"):
            s_servers = ServerSerializer(application.servers, many=True)
            return Response(s_servers.data)
        else:
            server_id = request.data.get("id")
            if not server_id:
                return Response(
                    "Server details must be provided",
                    status=HTTP_400_BAD_REQUEST)

            server = get_object_or_404(Server, id=server_id)

            if request.method == "POST":
                application.servers.add(server)
                return Response(
                    "Server added to the application",
                    HTTP_201_CREATED)

            elif request.method == "DELETE":
                application.servers.remove(server)
                return Response(
                    "Server removed from the application",
                    HTTP_204_NO_CONTENT)

Я хотел бы, чтобы серверы были уникальными, а приложения могли иметь много серверов.Итак, я разрешу доступ к серверам, используя

/api/servers and /api/servers/<int:pk>

Я хотел бы, чтобы пользователи добавляли существующие серверы в свои приложения, используя

/api/applications/app_id/servers

Я могувыполнить все операции, кроме удаления сервера, который уже был добавлен в приложение.Как обработать HTTP-запрос на удаление, используя наборы для вложенного ресурса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...