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