arcee123
arcee123

Reputation: 243

how to troubleshoot DRF router duplicate urls

I am trying to set a series of Django Rest Framework URLs.

Below is my Serializer/ViewSet makeup

class ModelSerializer(serializers.HyperlinkedModelSerializer):
    schemas = SchemaSerializer(many=True, read_only=True)
    class Meta:
        model = dbModels
        fields = ('ModelName', 'pk', 'schemas')

class ModelViewSet(viewsets.ModelViewSet):
    queryset = dbModels.objects.all()
    serializer_class = ModelSerializer

class ModelListSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = dbModels
        fields = ('ModelName', 'pk')

class ModelListViewSet(viewsets.ModelViewSet):
    queryset = dbModels.objects.all()
    serializer_class = ModelListSerializer

Here is my Router List: from datagenerator.serializer import UserViewSet, \ ModelViewSet, ModelListViewSet

router = routers.DefaultRouter()
router.register(r'models', ModelViewSet)
router.register(r'modellist', ModelListViewSet)

However, when I'm running The localhost webserver, the DRF Front end shows this:

"models": "http://localhost:8000/datamaker/api/modellist/",
"modellist": "http://localhost:8000/datamaker/api/modellist/",

How do I stop this? I need models to go to models and modellist to go to modellist.

Thanks much...

Upvotes: 6

Views: 1024

Answers (1)

Alex Morozov
Alex Morozov

Reputation: 5993

Use the base_name argument:

router.register(r'models', ModelViewSet, base_name='models')
router.register(r'modellist', ModelListViewSet, base_name='modellist')

Since your serializers share the same data model, DRF might get stuck trying to automatically discover the url naming pattern. So it's better in this case to explicitly set the base_name.

If you're using a newer version of Django Rest Framework, you'll need to use basename='models' instead of base_name='model'.

Upvotes: 11

Related Questions