django rest extensions drf extensions TypeError at/data/register()获取了意外的关键字参数';家长查询查找';

django rest extensions drf extensions TypeError at/data/register()获取了意外的关键字参数';家长查询查找';,django,django-rest-framework,Django,Django Rest Framework,我正在尝试使用drf扩展设置一个简单的嵌套路由,但遇到以下问题,我遇到以下错误: 输入/数据时出现类型错误/ register()获得意外的关键字参数“parents\u query\u lookups” 正在尝试实现/data/Survey//Version//Product// 每个调查都有多个版本,这些版本将包含多个产品,例如/data/survey/survey1_name/version/survey1_version1/product/survey1_version_product1

我正在尝试使用drf扩展设置一个简单的嵌套路由,但遇到以下问题,我遇到以下错误: 输入/数据时出现类型错误/ register()获得意外的关键字参数“parents\u query\u lookups”

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

但目前我有未嵌套的端点

/数据/调查/

/数据/版本/

/数据/产品/

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]
序列化程序.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')
url.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)),
]
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']))

为了使项目按照数据的层次结构进行良好的组织,我要做的第一件事是将URL的每一层分离成一个单独的实体,甚至可能是一个单独的文件。第二种方法是向RESTAPI的每一层添加主键端点。最后,它看起来是这样的:

调查_url.py

router.register(r'survey', views.SurveyViewSet, base_name='survey')
router.register(r'survey-version/', include('my_app.rest_server.version_urls'))
router.register(r'version', views.VersionViewSet, base_name='version')
router.register(r'version-product/', include('my_app.rest_server.product_urls'))
router.register(r'product/(?P<pk>[0-9]+)$', views.ProductViewSet, base_name='product')
version\u url.py

router.register(r'survey', views.SurveyViewSet, base_name='survey')
router.register(r'survey-version/', include('my_app.rest_server.version_urls'))
router.register(r'version', views.VersionViewSet, base_name='version')
router.register(r'version-product/', include('my_app.rest_server.product_urls'))
router.register(r'product/(?P<pk>[0-9]+)$', views.ProductViewSet, base_name='product')
product\u url.py

router.register(r'survey', views.SurveyViewSet, base_name='survey')
router.register(r'survey-version/', include('my_app.rest_server.version_urls'))
router.register(r'version', views.VersionViewSet, base_name='version')
router.register(r'version-product/', include('my_app.rest_server.product_urls'))
router.register(r'product/(?P<pk>[0-9]+)$', views.ProductViewSet, base_name='product')
router.register(r'product/(?P[0-9]+)$”,views.ProductViewSet,base_name='product')
然后,您的最终url可能如下所示:/data/survey version/33/version product/5/product/8

很可能,这是一个不必要的复杂问题,因为每个产品都有自己的唯一id,然后您可以使用一个url(如:/data/product/pk)访问它,使用一个url路由,即上面的最后一行代码


我的示例假设记录有一个数字主键,如果不是这样,则必须相应地更改regex。

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

url.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)),
]
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']))
这是因为NestedRouterMixin.register()返回NestedRegistryItem的实例,该类理解
parents\u query\u lookups
参数