#python-3.x #django #django-rest-framework
Вопрос:
Используя платформу Django Rest, я создаю конечные точки для модели doctor в своем приложении app_api
с помощью ModelViewSet
. Я сталкиваюсь со следующей ошибкой при добавлении дополнительного действия для обновления is_verified
поля с verify
помощью метода, имеющего @action
декоратор.
error at /app_api/viewset/doctor/6/ redefinition of group name 'pk' as group 2; was group 1 at position 38
Пожалуйста, найдите код ниже.
urls.py
router = DefaultRouter()
router.register('doctor', views.DoctorViewSet, basename='doctor')
urlpatterns = [
path('viewset/', include(router.urls)),
path('viewset/<int:pk>', include(router.urls)),
]
model.py
# Doctor Model
class Doctor(models.Model):
name = models.CharField(max_length=100)
designation = models.CharField(max_length=100)
description = models.TextField(blank=True, default='')
is_verified = models.BooleanField(default=False, blank=True)
serializer.py
# Doctor Model Serializer
class DoctorModelSerializer(serializers.ModelSerializer):
class Meta:
model = Doctor
fields = '__all__'
read_only_fields = ('is_verified',)
# Doctor Partial Update Model Serializer
class DoctorUpdateVerifyModelSerializer(serializers.ModelSerializer):
class Meta:
model = Doctor
fields = ('id', 'name', 'is_verified')
read_only_fields = ('name',)
views.py
class DoctorViewSet(viewsets.ModelViewSet):
serializer_class = DoctorModelSerializer
queryset = Doctor.objects.all()
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'PATCH' and self.action == 'verify':
serializer_class = DoctorUpdateVerifyModelSerializer
return serializer_class
@action(methods=['patch'], detail=True)
def verify(self, request, pk=None):
serializer = self.get_serializer(self.get_object(), data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
Теперь, когда я добавляю дополнительное действие для маршрутизации метода verify
с @action
помощью декоратора, я получаю следующую ошибку при доступе к URL-адресу для /app_api/viewset/doctor/6/ и /app_api/viewset/doctor/6/проверить/ где 6
находится первичный ключ doctor
error at /app_api/viewset/doctor/6/ redefinition of group name 'pk' as group 2; was group 1 at position 38
Если я удалю detail=True
verify
метод с аннотацией @action
, он хорошо работает для /app_api/viewset/doctor/6/. Мой вопрос в том, почему возникает эта ошибка, если у меня есть @action
декоратор detail=True
.
Комментарии:
1. Почему вы дважды включаете URL-адреса маршрутизатора в свой urls.py? Вы пробовали удалить второе включение?
2. Вопросы, требующие помощи в отладке, должны включать полную обратную трассировку. Только сообщение об ошибке само по себе не очень информативно.
Ответ №1:
Я решил проблему, удалив второе включение router.urls
т. Е., path('viewset/<int:pk>', include(router.urls))
, из urls.py
.
Обновленный кодекс urls.py является
router = DefaultRouter()
router.register('doctor', views.DoctorViewSet, basename='doctor')
urlpatterns = [
path('viewset/', include(router.urls)),
]