Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django rest extensions drf-extensions TypeError at /data/ register() got an unexpected keyword argument 'parents_query_lookups'

I am trying to get a simple nested route set up with drf-extensions but am having trouble following the docs, I am getting this error: TypeError at /data/ register() got an unexpected keyword argument 'parents_query_lookups'

Trying to achieve /data/Survey/<survey>/Version/<version>/Product/<product>/ each survey has multiple versions and those versions will contain multiple Products e.g., /data/survey/survey1_name/version/survey1_version1/product/survey1_version_product1/

but currently I have un-nested endpoints

/data/survey/

/data/versions/

/data/products/

models.py

class Survey(models.Model):
  survey = models.CharField(choices=SURVEYS, max_length=100)


class Version(models.Model):
  version = models.CharField(choices=DATA_RELEASES, max_length=50)
  survey = models.ForeignKey(Survey)


class Product(models.Model):
  product = models.CharField(choices=PRODUCTS, max_length=100)
  version = models.ForeignKey(Version)

views.py

class SurveyViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
  queryset = Survey.objects.all()
  serializer_class = SurveySerializer
  permission_classes = [permissions.AllowAny]

class VersionViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
  queryset = Version.objects.all()
  serializer_class = VersionSerializer
  permission_classes = [permissions.AllowAny]

class ProductViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
  queryset = Product.objects.all()
  serializer_class = ProductSerializer
  permission_classes = [permissions.AllowAny]

serializers.py

class SurveySerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
    model = Survey
    fields = ('id', 'survey')

class VersionSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
    model = Version
    fields = ('id', 'version', 'survey')

class ProductSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
      model = Product
      fields = ('id', 'product', 'version')

urls.py

router = ExtendDefaultRouter()
router.register(r'surveys', views.SurveyViewSet, base_name='survey')
router.register(r'versions', views.VersionViewSet, parents_query_lookups=['survey']),
router.register(r'products', views.ProductViewSet, parents_query_lookups=['version'])


urlpatterns = [
  url(r'^data/', include(router.urls)),
]
like image 865
Liz Avatar asked Oct 20 '25 01:10

Liz


1 Answers

You should chain the calls to register(), instead of calling them directly on the router :

urls.py

router = ExtendDefaultRouter()
(router.register(r'surveys', views.SurveyViewSet, base_name='survey')
      .register(r'versions', views.VersionViewSet, parents_query_lookups=['survey']),
      .register(r'products', views.ProductViewSet, parents_query_lookups=['version']))

That's because NestedRouterMixin.register() returns an instance of NestedRegistryItem, which is the class that understand the parents_query_lookups parameter.

like image 171
Thomas Wajs Avatar answered Oct 21 '25 15:10

Thomas Wajs



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!