#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'