传递URL变量并将其用于查询

时间:2019-12-12 05:47:49

标签: python django django-rest-framework

应用的初始流程如下:

  1. 用户点击language
  2. 网址根据给定的id中的language触发GET请求
  3. 返回并显示与给定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参数,然后在视图中使用它们的任何想法/示例?

1 个答案:

答案 0 :(得分:1)

感谢RetrieveModelMixin,使用ReadOnlyModelViewSet django-rest-framework已经为您生成了^selected-language/(?P<pk>[^/.]+)/$ [name='language-detail']

它使用GenericAPIView.get_object()通过Language(在您的情况下为lookup_field)中找到pk个实例。

因此,您可以使用selected-language/1Language来获得id=1,而无需分页。