@postya

Как сделать динамичный url в django rest, где меняется имя в середине Url?

Имеются модели обьекта
Имеются serializers, которые конвертируюь каждую модель обьекта
Имеются views, где я расписываю методы для каждой модели
Имеются роуты в файле urls.py для каждого обекта

Таблицы в базе данных такого рода:
Category1
Categoy2
Category3
Category4

На данный момент всё работает, но мне бы хотелось, сделать рефакторинг, чтобы сделать urls динамичными и не копировать почти одинаковый url. Чтобы как-то уменьшить строки кода

Как это можно сделать?

models.py:

class Category1(models.Model):
    question = models.TextField()
    answer = models.TextField()

    def __str__(self):
        return self.question


class Category2(models.Model):
    question = models.TextField()
    answer = models.TextField()

    def __str__(self):
        return self.question


serializers.py:

class Category1Serializer(serializers.ModelSerializer):
    class Meta:
        model = Category1
        fields = '__all__'


class Category2Serializer(serializers.ModelSerializer):
    class Meta:
        model = Category2
        fields = '__all__'

views.py:
class Category1All(APIView):
    @staticmethod
    def get(request):
        cards = Category1.objects.all()
        serializer = Category1Serializer(cards, many=True)
        return Response(serializer.data)

    @staticmethod
    def post(request):
        serializer = Category1Serializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class Category1Details(APIView):
    @staticmethod
    def get_object(self, id):

        try:
            return Category1.objects.get(id=id)

        except Category1.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self, request, id):
        question = self.get_object(self, id)
        serializer = Category1Serializer(question)
        return Response(serializer.data)


class Category2All(APIView):
    @staticmethod
    def get(request):
        cards = Category2.objects.all()
        serializer = Category2Serializer(cards, many=True)
        return Response(serializer.data)

    @staticmethod
    def post(request):
        serializer = Category2Serializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class Category2Details(APIView):
    @staticmethod
    def get_object(self, id):

        try:
            return Category2.objects.get(id=id)

        except Category2.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self, request, id):
        question = self.get_object(self, id)
        serializer = Category2Serializer(question)
        return Response(serializer.data)


urls.py:

# Category 1
    path('api/v1/category1/all', Category1All.as_view()),
    path('api/v1/category1/<int:id>', Category1Details.as_view()),

    # Category 2
    path('api/v1/category2/all', Category2All.as_view()),
    path('api/v1/category2/<int:id>', Category2Details.as_view()),
  • Вопрос задан
  • 301 просмотр
Пригласить эксперта
Ответы на вопрос 1
@barolina
turn coffee into code
# где Categorys -  общий  вью,  который   вызывает нужную, в зависимости от пришедшего cat
  path('api/v1/<str:cat>/<?int:id>', Categorys.as_view()),
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы