【问题标题】:How to get single field as result in django rest framework query?如何在 django rest 框架查询中获取单个字段?
【发布时间】:2018-05-16 16:37:12
【问题描述】:

所以我在 Django 中设置了一个 REST API,但不知道如何使用 http 查询返回模型中单个字段的结果。例如,假设我们的模型 User 具有属性“id”、“username”和“email”。

返回该模型实例的所有相关字段很容易,但我将如何从查询中获取单个字段?

我正在寻找类似 myapp/api/user/1?username 或 myapp/api/user/1/username 的东西,但我找不到任何好的答案。

【问题讨论】:

标签: django django-rest-framework django-filter


【解决方案1】:

另一种适用于模型中所有字段的方法,

class UserViewSet(viewsets.ViewSet):
    permission_classes = [IsAuthenticated]

    def field(self, request, pk, fname):
        user = User.objects.get(id=pk)
        data = getattr(user, fname)

        return Response({'result':data})

修改urls.py以路由到视图,

url(r'^user/(?P<pk>[0-9]+)/(?P<fname>\w+)/$', UserViewSet.as_view({'get': 'field',}), name='user-field'),

网址格式会是,

/user/<user-id>/<field-name>/

注意:您还可以在视图中为未知字段等添加错误场景(并发送 4xx 错误)。

【讨论】:

    【解决方案2】:

    所以你想过滤你的模型结果,对吗? 如果是这样,看起来您需要创建一个 APIView,获取您的模型,然后操作您要显示的字段。

    类似这样的:

    class UserField(APIView): 
    
    
        def get(self, request):
            path = str.split(str(request.path),'/')
            print(path)
            fieldname = path[4] #check your path on the print
            if fieldname= 'username':
                content={'username':User.objects.get(pk=path[3]).username}
                     content = {
                    'fieldname': 'something',   
                }            
    
                return Response(content)
    

    【讨论】:

    • 那么我需要对模型的每个字段都这样做吗?
    • 不,对于每个模型...只需遍历您的字段并与路径进行比较
    • 我还是一头雾水。有什么方法可以让你展示一个例子来说明它是如何工作的?
    • 我想是的,您实际上是在绕过序列化程序以仅返回该字段?
    • 如果你有模型,你可以使用序列化器,但由于你没有使用它,我真的不明白这一点......
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2021-09-02
    • 2018-09-17
    • 2018-07-15
    • 2018-01-01
    相关资源
    最近更新 更多