Skip to main content
 首页 » 编程设计

python之ViewSets 是否在 Django Rest Framework 中生成 view_names

2025年01月19日25insus

我想在我的序列化程序中使用 HyperlinkedIdentityField,这就是我需要 View 名称的原因。例如,如果我需要 model_name-list,如何获取 View 名称?

这是我的序列化器:

class CategorySerializer(serializers.HyperlinkedModelSerializer): 
posts = serializers.HyperlinkedIdentityField(view_name='', format=None) 
class Meta: 
    model = Category 
    fields = ('url', 'category_name', 'id', 'parent', 'posts') 

这是我的views.py:

class PostViewSet(viewsets.ModelViewSet): 
queryset = Post.objects.all() 
serializer_class = PostSerializer 

这是我的 urls.py:

router = routers.DefaultRouter() 
router.register(r'categories', views.CategoryViewSet) 
router.register(r'posts', views.PostViewSet) 
 
 
urlpatterns = [ 
    url(r'^', include(router.urls)), 
] 

我的模型:

class Post(models.Model): 
    post_name = models.CharField(max_length=50) 
    post_text = models.CharField(max_length=1000) 
    pub_date = models.DateTimeField('date published') 
    categories = models.ManyToManyField('Category', related_name='posts') 
    def __str__(self): 
        return self.post_name 
 
class Category(models.Model): 
    category_name = models.CharField(max_length=50) 
    parent = models.ForeignKey('self', null=True, blank=True, on_delete = models.CASCADE) 
    def __str__(self): 
    return self.category_name 

我需要一个 view_name 用于 post-list,以便使用 HyperlinkedIdentityField

请您参考如下方法:

正如 DRF 中路由器的文档 (http://www.django-rest-framework.org/api-guide/routers/) 所说,如果在注册 ViewSet 时未传递 base_name 参数,则将根据定义路由器时注册的 ViewSet 的查询集属性自动生成 view_name。

在您的情况下,对于 ListView ,view_name 应该是“post-list”,对于 View 集的详细 View ,view_name 应该是“post-detail”,除非您想通过将它作为第三个参数传递给路由器来更改/覆盖它。注册()。

另请注意,如果您没有为 ViewSet 初始化 base_name,则 queryset 属性应始终存在,否则会引发错误。