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
相关产品推荐
相关产品推荐

