创建后URL不存在 - python

这是我的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'))
]

但是,只有languagesframeworks起作用。 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 

仅支持listretrieve操作,因此是从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…