django 休息扩展 drf-extensions TypeError at /data/ register() 有一个意外的关键字参数 'parents_query_lookups'

Liz*_*Liz 4 django django-rest-framework

我正在尝试使用 drf-extensions 设置一个简单的嵌套路由,但在遵循文档时遇到问题我收到此错误: /data/ register() 处的 TypeError 获得意外的关键字参数 'parents_query_lookups'

尝试实现 /data/Survey/<survey>/Version/<version>/Product/<product>/ 每个调查都有多个版本,这些版本将包含多个产品,例如 /data/survey/survey1_name/version/survey1_version1/product /survey1_version_product1/

但目前我有未嵌套的端点

/数据/调查/

/数据/版本/

/数据/产品/

模型.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)
Run Code Online (Sandbox Code Playgroud)

视图.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]
Run Code Online (Sandbox Code Playgroud)

序列化器.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')
Run Code Online (Sandbox Code Playgroud)

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)),
]
Run Code Online (Sandbox Code Playgroud)

Tho*_*ajs 5

您应该将调用链接到 register(),而不是直接在路由器上调用它们:

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']))
Run Code Online (Sandbox Code Playgroud)

这是因为 NestedRouterMixin.register() 返回一个 NestedRegistryItem 的实例,它是理解该parents_query_lookups参数的类。