django - 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 中提取并传递它,它会按预期工作,但我宁愿客户端不需要知道如何解析“真实”标识符的超链接标识符。
我也可以id
将HyperlinkedModelSerializer
解决方案
我想出了一种使用drf
'sViewSet
操作的替代方法。我没有使用Publisher
URI 来过滤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 会更加灵活,但这很有效。
推荐阅读
- javascript - 通过 AJAX 向 Django 视图提交 JS 数组返回 TypeError
- arduino - 软件 PLL 在 arduino 中从 GPS 生成 3.2 Khz 采样频率锁定为 1pps
- asp.net - 在具有相同名称的不同名称空间中招摇不同的类不起作用
- javascript - 确定单击的组件是否具有 routerLink 属性的正确方法是什么?
- casting - F#:将 seq<'A> 转换为 seq<'B> 的最快方法
- javascript - 点击播放音频链接
- cors - 400 错误请求响应调用 web api localhost/token url 以生成令牌
- windows - Delphi6 应用程序抛出“运行时错误 217”
- regex - 使用 ARRAYFORMULA() 获取每行的 MAX()
- angular - 在 app.module.ts 中添加导入 BrowserAnimation 模块时,UI 加载奇怪