这是我的views.py:
class LanguageViewSet(viewsets.ModelViewSet):
queryset = Language.objects.all().order_by('name')
serializer_class = LanguageSerializer
class FrameworkViewSet(viewsets.ModelViewSet):
queryset = Framework.objects.all()
serializer_class = FrameworkSerializer
class SelectedLanguageViewSet(viewsets.ModelViewSet):
queryset = Language.objects.all()
serializer_class = FrameworkSerializer
def get_queryset(self):
request = self.request
language_id = request.query_params.get('language_id')
language = Language.objects.filter(id=language_id)
self.queryset = language.framework_set.all()
return self.queryset
还有我的urls.py:
router = routers.DefaultRouter()
router.register(r'languages', views.LanguageViewSet)
router.register(r'frameworks', views.FrameworkViewSet)
router.register(r'language/<int:language_id>', views.SelectedLanguageViewSet)
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
但是,只有languages
和frameworks
起作用。 language
不存在。是因为get_queryset
吗?我什至尝试删除url参数中的<int:language_id>
,但它仍然不会显示。
编辑:
原谅我的天真,我对django和DRF还是很陌生
更新资料
我的意思是这样的(没有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')
因此,整个流程将是:
用户点击一种语言
根据所选语言的ID触发获取请求
返回与语言相关的框架对象
这适用于基于普通模板的Django。但是我不知道如何在DRF上使用所有视图集等执行类似的操作。
参考方案
是的,这是因为您的get_queryset
(以及您的URL定义)。
首先,从URL前缀中删除<int:language_id>
,因为DRF路由器会自动为您生成列表和详细信息URL端点。此外,当您使用正则表达式路径时,language/<int:language_id>
是按字面意义使用的(<int:language_id>
在使用path
时具有含义,而不是re_path
)。
在您的SelectedLanguageViewSet.get_queryset
中,您尝试返回与某个Framework
相关的所有Language
实例(您认为应该从language_id
查询参数中获取该实例)。该视图集适用于Language
模型,至多您应该对queryset
中的默认get_queryset
进行一些过滤。绝对不要从另一个模型返回完全不同的查询集。传递/language/1/
时(固定URL后)会发生什么? (1是Language
ID还是Framework
ID?提示:根据您当前的设计,它将引用Framework
实例ID)。
FWIW,URL捕获作为视图集实例(即kwargs
)中的self.kwargs
属性出现,而不是通过查询字符串。
修改答案:
要在DRF中实现,您可以仅使用frameworks
字段为语言定义一个序列化器:
from viewsets import ReadOnlyModelViewSet
class SelectedLanguageViewSet(ReadOnlyModelViewSet):
queryset = Language.objects.all()
serializer_class = LangaugeRelationSerializer
仅支持list
和retrieve
操作,因此是从ReadOnlyModelViewSet
继承的。
现在,序列化程序(只有一个字段-frameworks
):
class LangaugeRelationSerializer(serializers.ModelSerializer):
frameworks = FrameworkSerializer(source='framework_set', many=True)
class Meta:
model = Language
fields = ('frameworks',)
默认情况下,ModelSerializer
将相关字段设置为PrimaryKeyRelatedField
,因此相关对象表示为其主键。如果您希望使用它而不使用FrameworkSerializer
:
class LangaugeRelationSerializer(serializers.ModelSerializer):
frameworks = serializers.PrimaryKeyRelatedField(source='framework_set', many=True)
class Meta:
model = Language
fields = ('frameworks',)
由于默认为PrimaryKeyRelatedField
,因此您还可以在source
中定义Meta.extra_kwargs
(以免您自己编写字段定义):
class LangaugeRelationSerializer(serializers.ModelSerializer):
class Meta:
model = Language
fields = ('frameworks',)
extra_kwargs = {
'frameworks': {
'source': 'framework_set',
'many': True,
},
}
Django-不是注册的名称空间 - python我正在尝试使用以下代码在django / python中处理表单。home.html:<form action="{% url 'home:submit' %}"method='post'> views.py:def submit(request): a = request.POST([…
在返回'Response'(Python)中传递多个参数 - python我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…
django-getlist() - python我刚刚发布了这个问题jQuery - passing arrays in post request,在发布请求中我不发送数组,但是jQuery代码没有问题。问题在于在django中接收到POST请求。我确实喜欢这个def portfolio_add(request): ukeys = request.POST.getlist('ukeys'…
Django HttpResponseRedirect - python我创建了一个基本的联系表单,当用户提交信息时,它应该重定向到“谢谢”页面。 views.py :def contact(request): # if no errors... return HttpResponseRedirect('/thanks/') urls.py :(r'^contact/$', contact…
Python exchangelib在子文件夹中读取邮件 - python我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…