Ошибка: переопределение имени группы «pk» как группы 2; была ли группа 1 в позиции 38

#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)),
]