You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest Framework中ViewSet是否生成view_name?如何获取post-list视图名?

解答你的DRF ViewSet与HyperlinkedIdentityField问题

嘿,我来一步步帮你解决这两个问题:

问题1:在Django Rest Framework中,ViewSets是否会生成view_name?

当然会!当你使用DefaultRouter注册ViewSet时,DRF会自动为每个ViewSet生成两个标准的view_name:

  • {model_name}-list:对应列表视图(比如你的posts注册后就是post-list)
  • {model_name}-detail:对应详情视图(比如post-detail)

这里的model_name是你模型类名称的小写形式(比如Post模型对应post,Category对应category),完全符合你提到的model_name-list格式。

问题2:如何获取并使用post-list这类视图名?

首先要提醒你一个小细节:你当前用的HyperlinkedIdentityField是用来指向当前模型实例自身的链接,但你的posts字段是Category和Post的多对多关联(related_name='posts'),也就是一个Category对应多个Post,这种场景下应该用HyperlinkedRelatedField来关联多个外部模型实例。

不过回到你的需求,下面针对两种场景给出具体的代码修改方案:

场景1:关联该Category下的所有Post详情链接(更符合业务逻辑)

from rest_framework import serializers
from .models import Category

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    posts = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='post-detail'  # DRF自动生成的Post详情视图名
    )

    class Meta:
        model = Category
        fields = ('url', 'category_name', 'id', 'parent', 'posts')

场景2:确实需要指向Post的列表视图

如果你有特殊需求要在Category序列化器里添加指向所有Post列表的链接,可以单独定义一个字段:

from rest_framework import serializers
from .models import Category

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    post_list = serializers.HyperlinkedIdentityField(
        view_name='post-list',
        format=None
    )

    class Meta:
        model = Category
        fields = ('url', 'category_name', 'id', 'parent', 'post_list')

验证view_name的正确性

你可以通过运行python manage.py show_urls(需要先安装django-extensions)来查看所有注册的URL对应的view_name,确认post-list和post-detail是否存在。


内容的提问来源于stack exchange,提问作者Alibi Yeslambek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:05:10