首页 > 解决方案 > 如何路由我的 API 调用以收集具有连接到特定模型实例的 ForeignKey 的所有对象?

问题描述

我试图实现的目标是查询与另一个模型的单个实例具有外键关系的所有特定模型。

我很好奇路由 API 调用的正确方法是什么样的。想法/希望是它看起来类似于:

'/api/v1/devices/<id>/breadcrumbs'

我是 Django Rest Framework 的新手,不确定在这里做什么。我创建了如下基本视图集:

class DeviceViewSet(viewsets.ModelViewSet):
    queryset = Device.objects.all()
    serializer_class = DeviceSerializer

class BreadcrumbViewSet(viewsets.ModelViewSet):
    queryset = Breadcrumb.objects.all()
    serializer_class = BreadcrumbSerializer

以及基本路线:

router.register(r'devices', DeviceViewSet)
router.register(r'breadcrumbs', BreadcrumbViewSet)

和面包屑模型:

class Breadcrumb(models.Model):
    timestamp = models.DateTimeField(
        auto_now_add=True,
        editable=False,
        null=False,
        blank=False
    )
    device = models.ForeignKey(
        Device, 
        on_delete=models.CASCADE
    )

但不知道如何将其扩展到我希望实现的逻辑。

标签: djangodjango-rest-frameworkroutes

解决方案


有一个你可能感兴趣的项目,这里是官方文档

这样你就可以像这样创建 urls.py :

from rest_framework_nested import routers

device_router = routers.SimpleRouter()
device_router.register(r'devices', DeviceViewSet)

device_breadcrumbs_router = routers.NestedSimpleRouter(device_router, r'breadcrumbs', lookup='breadcrumb')
device_breadcrumbs_router.register(r'breadcrumbs',BreadcrumbViewSet)

并在 BreadcrumbViewSet 覆盖:

def get_queryset(self):
    device_id = self.kwargs.get('device',None)

    return Breadcrumb.objects.filter(device_id=device_id)

以相同的方式覆盖“get_queryset”,您可以在“perform_create”、“perform_update”等上获得相同的结果。


推荐阅读