首页 > 解决方案 > Django Rest Framework:使用超链接 URI 过滤关系

问题描述

我正在使用 Django Rest Framework 创建一个简单的 API。我有两个具有外键关系的模型:

class Article(models.Model):
    publisher = models.ForeignKey('Publisher', ...)

class Publisher(models.Model):
    name = ...

我正在使用超链接标识符对它们进行序列化:

{
  "url": "http://localhost:8000/api/1/article/1",
  "publisher": {
    "url": "http://localhost:8000/api/1/publisher/1",
    "name": "Publisher One"
  },
  ...
}

我想根据特定文章的发布者过滤所有文章,最好是这种形式:

http://localhost:8000/api/1/article?publisher=http://localhost:8000/api/1/publisher/1

我尝试创建一个 custom FilterClass,但url它不是模型上的实际字段,所以我不确定如何引用它。

如果我id从 URL 中提取并传递它,它会按预期工作,但我宁愿客户端不需要知道如何解析“真实”标识符的超链接标识符。

我也可以idHyperlinkedModelSerializer

标签: djangodjango-rest-frameworkdjango-filters

解决方案


我想出了一种使用drf'sViewSet操作的替代方法。我没有使用PublisherURI 来过滤Article端点,而是向发布者视图添加了一个自定义操作以返回匹配的文章:

class PublisherViewSet(base.ReadOnlyModelViewSet):
    queryset = models.Publisher.objects.order_by('name')
    ...

    @action(methods=['get'], detail=True)
    def unclaimed(self, request, pk=None):
        serializer = ArticleFieldSerializer(context={'request': request})
        unclaimed = models.Article.objects.unfinished().filter(publisher=pk)
        return Response(
            [serializer.to_representation(article) for article in unclaimed]
        )

不需要解析 URI,我只需要将操作附加到它和GET.

能够过滤 URI 会更加灵活,但这很有效。


推荐阅读