我需要获取某些视图集逻辑中的查询字符串值(在本例中,从ModelViewSet派生).我读到的所有内容,包括Django rest框架文档,都说request是视图集的一个属性.但是,当我实际try 在代码中引用它时,无论我如何操作,都会显示运行时错误'AddressViewSet' object has no attribute 'request'.以下是触发错误的类定义的一个简化版本:

class AddressViewSet(viewsets.ModelViewSet):
    def __init__(self, suffix, basename, detail):
        attendee = ""
        if self.request.query_params.get('attendee'):
            attendee = self.request.query_params.get('attendee')

        self.serializer_class = AddressSerializer
        self.queryset = Address.objects.all()

如何在DRF中读取视图集逻辑中的request个属性?

推荐答案

您正在重写不正确的方法.与Django中的所有基于类的视图一样,ViewSet(所有DRF视图继承自django.views.generic.View)甚至在收到请求之前就被实例化(通常被视为View.as_view()的模式在内部创建类的一个实例).该实例在URL模式中使用,并且当找到与URL模式匹配的请求时,为视图调用dynamically created function,然后该视图调用dispatch.

返回到点__init__不是要覆盖的正确方法,如果您想要过滤查询集,则应该覆盖get_queryset:

class AddressViewSet(viewsets.ModelViewSet):
    queryset = Address.objects.all()
    serializer_class = AddressSerializer

    def get_queryset(self):
        queryset = super().get_queryset()
        attendee = ""
        if self.request.query_params.get('attendee'):
            attendee = self.request.query_params.get('attendee')
        # Filter queryset here
        return queryset

Django相关问答推荐

对象Django API中的对象

其中实际的数据库提取在DRF list()中完成

如何在Django上创建ManyToMany管理面板?

Django OneToOneFieldto抽象对象

在生成的表单元素处出现多值DictKeyError

在 Trunc 的 kind 属性中使用字段

根据当前对象中的多对多字段过滤对象

Django Rest Framework 认证类覆盖 request.user

DecimalField 验证错误,返回不正确的值 Django

在 settings.py 中指定 Django 测试数据库名称

django - 表单没有错误,但 form.is_valid() 没有验证

如何解决 AssertionError: .accepted_renderer not set on Response in django and ajax

InvalidBasesError:无法解析 [] 的基础

删除所有表的django命令是什么?

Django聚合:仅求和返回值?

如何在Django中获取一个组的所有用户?

Django:显示在每个页面上加载页面所花费的时间

Django 默认=timezone.now + delta

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

javascript 文件中的 Django {% static 'path' %}