为了账号安全,请及时绑定邮箱和手机立即绑定

DRF:方法GET返回基于参数的对象

DRF:方法GET返回基于参数的对象

12345678_0001 2021-12-29 10:21:56
我正在学习 Django 并试图构建一个端点,该端点根据 URL 中给定的参数返回对象。目前我有这些网址:/api/v1/ 作为 root 返回:GET /api/v1/HTTP 200 OKAllow: GET, HEAD, OPTIONSContent-Type: application/jsonVary: Accept{    "device-groups": "http://127.0.0.1:8000/api/v1/device-groups/"}/api/v1/device-groups/ 它返回所有设备组:HTTP 200 OKAllow: GET, POST, HEAD, OPTIONSContent-Type: application/jsonVary: Accept[    {        "device_group_name": "Default",        "group_uuid": "7465febe-7c46-4420-85a1-73dfe0af812c",        "color": "4286f4",        "is_default": true,        "customer": {            "customer_name": "Customer1",            "customer_uuid": "b3eb5d7d-d1a8-4997-a65b-28bed71b7cc6"        }    },    {        "device_group_name": "Default",        "group_uuid": "e12d02d0-7916-477e-b318-9680a38617db",        "color": "4286f4",        "is_default": true,        "customer": {            "customer_name": "Another customer",            "customer_uuid": "5b5dafab-c311-4f58-80f5-c50d77fcf8a5"        }    },    {        "device_group_name": "group of customer1",        "group_uuid": "c72e87b1-e7c8-4dcd-a9c7-4f6a016d7676",        "color": "#ffffff",        "is_default": false,        "customer": {            "customer_name": "Customer1",            "customer_uuid": "b3eb5d7d-d1a8-4997-a65b-28bed71b7cc6"        }    }]我想要一个端点/api/v1/device-groups/<customer_uuid>/,它返回与给定 customer_uuid 相关的设备组。我的serializers.py:class CustomerSerializer(serializers.HyperlinkedModelSerializer):    class Meta:        model = Customer        fields = ('customer_name', 'customer_uuid')class DeviceGroupSerializer(serializers.HyperlinkedModelSerializer):    customer = CustomerSerializer(many=False, read_only=True)    class Meta:        model = DeviceGroup        fields = ('device_group_name', 'group_uuid', 'color', 'is_default', 'customer')我需要更改什么才能获得/api/v1/device-groups/<customer_uuid>/仅显示与给定 customer_uuid 相关的设备组的端点?
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

路由器无法确定basename。您必须basename在路由器中定义一个。像这样

router.register(r'device-groups', views.DeviceGroupViewSet, base_name='device-groups')

base_name实际上用于为路由/url 生成名称。您可以在此处阅读更多相关信息。


查看完整回答
反对 回复 2021-12-29
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

我不熟悉 DRF,但一般来说,为了根据参数获取对象,您必须:


1) 以这样一种方式定义您的 url,以记住当您想要构建端点时将动态输入的 customer_uuid 因此,在正则表达式的帮助下,您必须构建如下内容:


url(r'^/api/v1/device-groups/(?P<customer_uuid>\d+)/$', views.your_view, name='your_view')

正则表达式 \d+ 将匹配任意大小的整数。该整数将用于从数据库中检索客户。现在观察我将正则表达式写为 (?P\d+),这告诉 Django 将值捕获到名为 customer_uuid 的关键字参数中。


2)定义你的视图函数


from django.shortcuts import render, get_object_or_404

from .models import Customer


def your_view(request, customer_uuid):

    customer = get_object_or_404(Customer, pk=customer_uuid)

    return render(request, 'customer.html', {'customer': customer})

希望能帮助到你


查看完整回答
反对 回复 2021-12-29
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

如果您在视图中定义不同的 lookup_field,您应该得到您想要的,例如:


class DeviceGroupViewSet(viewsets.ModelViewSet):

    serializer_class = DeviceGroupSerializer

    queryset = DeviceGroup.objects.all()

    lookup_field = 'customer_uuid'

或者,您可能想查看此文档以考虑不同的方法。


查看完整回答
反对 回复 2021-12-29
  • 3 回答
  • 0 关注
  • 428 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号