如何在Django REST框架中向ModelViewSet传递多个变量?

5 投票
3 回答
8682 浏览
提问于 2025-04-18 12:39

我正在使用 Django REST框架

我遇到的情况是,我想传递两个或更多的变量,然后根据这些变量从数据库中获取数据。在下面的代码中,只有一个叫做pk的变量,我想用数据库中的另外两个字段来替换它。

另外,请告诉我如何写我的url配置。

Views.py

class ExampleViewSet(viewsets.ReadOnlyModelViewSet):
    model = myTable
    def list(self, request):
        queryset = myTable.objects.all()
        serializer = mySerializer(queryset, many=True)
        return Response(serializer.data)
    def retrieve(self, request, pk=None):
        queryset = myTable.objects.all()
        s = get_object_or_404(queryset, pk=pk)
        serializer = mySerializer(s)
        return Response(serializer.data)

Serializer.py

class Serializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = myTable
        fields = ('attr1', 'attr2', 'attr3')

3 个回答

-1

urls.py

  url( 
        regex=r'^teach/(?P<pk>\d+?)/(?P<pk1>\d+?)/$', 
        view=teach_update.as_view(), 
        name='teach' 
   )

这个文件是用来定义你的网站里每个页面的地址(URL)的。简单来说,它就像是一个地图,告诉网站用户每个页面在哪里。

Templates

<td><a href="/teach/{{tid}}/{{i.id}}"><button type="button" class="btn       
btn-warning">Update</button></a></td>

模板文件是用来设计网页外观的。你可以把它想象成网页的“衣服”,它决定了网页的样子和布局。通过模板,你可以把数据和内容展示得更好看。

Views.py

class teach_update(view):
     def get(self,request,**kwargs):
        dist=self.kwargs['pk']
        ddd=self.kwargs['pk1']

这个文件负责处理用户请求和返回响应。可以理解为它是网站的“大脑”,当用户访问某个页面时,views.py会决定要显示什么内容,并把这些内容送给用户。

14

下面是如何使用最近的 Django REST Framework 来实现这个功能。

假设你的变量在资源的 URL 中是这样的:

GET /parent/:id/child/
GET /parent/:id/child/:id/

那么:

在 urls.py 文件中:

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'parent/(?P<parent_id>.+)/child', views.ExampleViewSet)
urlpatterns = router.urls

在 views.py 文件中:

class ExampleViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = Serializer

    def get_queryset(self):
        parent = self.kwargs['parent']
        return myTable.objects.filter(parent=parent)

这里的 'parent' 在查询集部分是指你的父对象。你可能需要稍微调整一下,当然,但这个思路是通过 kwargs 来实现的。

这个方法还可以帮你减少一些代码,你只需通过继承就可以把它变成一个完整的 ModelViewSet

希望这对你有帮助。

更多信息请查看: DRF 根据 URL 进行过滤

4

这里有一个例子,展示了你可以如何实现你想要的功能:

class ExampleViewSet(viewsets.ReadOnlyModelViewSet):
# This code saves you from repeating yourself
queryset = myTable.objects.all()
serializer_class = mySerializer

def list(self, request, *args, **kwargs):
    # Get your variables from request
    var1 = request.QUERY_DICT.get('var1_name', None) # for GET requests
    var2 = request.DATA.get('var2_name', None) # for POST requests
    if var1 is not None:
        # Get your data according to the variable var1
        data = self.get_queryset().filter(var1)
        serialized_data = self.get_serializer(data, many=True)
        return Response(serialized_data.data)

    if var2 is not None:
        # Do as you need for var2
        return Response(...)

    # Default behaviour : call parent
    return super(ExampleViewSet, self).list(request, *args, **kwargs)

def retrieve(self, request, *args, **kwargs):
    # Same for retrieve
    # 1. get your variable xyz from the request
    # 2. Get your object based on your variable's value
    s = myTable.objects.get(varX=xyz)
    # 3. Serialize it and send it as a response
    serialized_data = self.get_serializer(s)
    return Response(serialized_data.data)
    # 4. Don't forget to treat the case when your variable is None (call parent method)

至于urlconf,这取决于你想要如何发送你的变量(可以通过get、post或者直接在网址中发送)。

希望这对你有帮助。

撰写回答