应用的初始流程如下:
language
id
中的language
触发GET请求frameworks
相关的所有language
没有DRF,它将看起来像这样:
views.py :
def frameworks_from_language(request, language_id):
language = Language.objects.get(pk=language_id)
if language == None:
# Do some stuffs
frameworks = language.framework_set.all()
template = 'app/language.html'
context = {
'frameworks': frameworks
}
return render(request, template, context)
在 urls.py 中:
path('language/<int:language_id>', views.frameworks_from_language, name='getframeworks')
这将返回带有对象frameworks
的模板,您只需在for循环中显示即可。但是我不知道如何在DRF上做类似的事情。
我尝试了此操作(根据朋友的建议):
serializers.py
class LanguageRelationSerializer(serializers.ModelSerializer):
class Meta:
model = Language
fields = ('frameworks',)
extra_kwargs = {
'frameworks': {
'source': 'framework_set',
'many': True
}
}
views.py
class SelectedLanguageViewSet(ReadOnlyModelViewSet):
queryset = Language.objects.all()
serializer_class = LanguageRelationSerializer
在 urls.py
中router.register('selected-language', views.SelectedLanguageViewSet)
但是它似乎不起作用。它只会显示如下内容:
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"frameworks": [
3
]
},
{
"frameworks": [
2
]
},
{
"frameworks": []
}
]
}
我什至没有在url中提供一些参数。
关于如何在DRF中传递url参数,然后在视图中使用它们的任何想法/示例?
答案 0 :(得分:1)
感谢RetrieveModelMixin
,使用ReadOnlyModelViewSet
django-rest-framework
已经为您生成了^selected-language/(?P<pk>[^/.]+)/$ [name='language-detail']
。
它使用GenericAPIView.get_object()
通过Language
(在您的情况下为lookup_field
)中找到pk
个实例。
因此,您可以使用selected-language/1
和Language
来获得id=1
,而无需分页。