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

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

如果我从URL中提取id并通过它,它会按预期工作,但我希望客户端不需要知道如何将超链接标识符解析为"真实"标识符。

我也可以将id添加到序列化程序中,但如果这是解决方案,那么HyperlinkedModelSerializer的意义何在?

我使用drfViewSet操作提出了另一种方法。我没有使用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进行过滤会更加灵活,但这是可行的。

最新更新