Я создаю 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-запрос на удаление, используя наборы для вложенного ресурса?