Как использовать декоратор действий для обновления?

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Мне нужно обновить мою конечную точку с помощью декоратора действий. Какой лучший способ выполнить действие для обновления?

У меня есть два сериализатора:

 class GarageViewSet(viewsets.ModelViewSet):
    queryset = Garage.objects.all()
    serializer_class = GarageSerializer
    model = Garage

class CarViewSet(RestrictedQuerysetMixin, viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    filter_backends = (DjangoFilterBackend,)
    filterset_fields = ('color', 'model')
    model = Car
  

Мне нужно получить полезную нагрузку списка с помощью «car» и обновить «garage» с помощью действия. Я пытаюсь что-то вроде этого:

 
class GarageViewSet(viewsets.ModelViewSet):
    queryset = Garage.objects.all()
    serializer_class = GarageSerializer
    model = Garage

    @action(detail=True, methods=['put'])
        def update_car(self, request):
            queryset = Car.objects.create()
            serializer = CarSerializer(queryset, many=True)
            return Response(serializer.data)
  

Мой URL-файл:

 from django.urls import path, include
from django.conf.urls import url
from rest_framework.routers import DefaultRouter
from rest_framework.documentation import include_docs_urls

from .views import garage


router = DefaultRouter()
router.register(r"garage", garage.GarageViewSet, base_name="car")
router.register(r"car", garage.CarViewSet, base_name="car")

urlpatterns = [
    url(r"^", include(router.urls))
]
  

пример полезной нагрузки:

 {
    "fuel": 2,
    "model": 2,
    "color": null,
}
  

У кого-нибудь есть идея для обновления действия??

Комментарии:

1. можете ли вы добавить свой urls.py файл?

2. Привет, @JPG Я только что добавил свой пример URL. Спасибо!

3. Проверьте мой ответ, хотя

4. Пожалуйста, добавьте полный urls.py файл

5. @JPG Ok. Я обновил.

Ответ №1:

Прежде всего, исправьте свой отступ,

 class GarageViewSet(viewsets.ModelViewSet):
    queryset = Garage.objects.all()
    serializer_class = GarageSerializer
    model = Garage

    @action(detail=True, methods=['put'])
    def update_car(self, request):
        queryset = Car.objects.create()
        serializer = CarSerializer(queryset, many=True)
        return Response(serializer.data)  

затем добавьте класс view в свой urls.py как,

 path('path/to/your/put/operation/', GarageViewSet.as_view({"put": "update_car"}), name='any-name-you-like'),
  

Обновление-1

 
#urls.py
from django.urls import path, include
from django.conf.urls import url
from rest_framework.routers import DefaultRouter
from rest_framework.documentation import include_docs_urls

from .views import garage

router = DefaultRouter()
router.register(r"garage", garage.GarageViewSet, base_name="car")
router.register(r"car", garage.CarViewSet, base_name="car")

urlpatterns = [
                  path('garage/<int:pk>/update-card/', GarageViewSet.as_view({"put": "update_car"}), name='any-name-you-like'),
              ]   router.urls  

Комментарии:

1. Привет, @JPG. Я привел свой пример URL. Когда я пытаюсь поместить ваш пример (с .as_view …), я получаю эту ошибку: AttributeError: 'function' object has no attribute 'get_extra_actions'

2. та же ошибка AttributeError: 'function' object has no attribute 'get_extra_actions'