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)
您应该将调用链接到 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参数的类。