如何从Django Rest Framwrek中的URL中捕获参数,以便在视图中对其进行处理

如何从Django Rest Framwrek中的URL中捕获参数,以便在视图中对其进行处理,django,django-rest-framework,Django,Django Rest Framework,我是Django的新手。我使用Django Rest框架作为Api Rest,但我需要生成一个端点或URL,该端点或URL将从前端(角度)传递,以获得自定义excel 问题是,例如,我将传递以下URL:127.0.0.1:8000/app_prtg/descarga/P79COL01 我想捕获值P79COL01,这将是我获取excel文件的筛选值,我在DRF视图中处理这个参数,然后生成excel P79COL01是与我的序列化模型接口的EquipoOrigen字段关联的值—— 我的网址 127.

我是Django的新手。我使用Django Rest框架作为Api Rest,但我需要生成一个端点或URL,该端点或URL将从前端(角度)传递,以获得自定义excel

问题是,例如,我将传递以下URL:
127.0.0.1:8000/app_prtg/descarga/P79COL01
我想捕获值
P79COL01
,这将是我获取excel文件的筛选值,我在DRF视图中处理这个参数,然后生成excel


P79COL01是与我的序列化模型接口的EquipoOrigen字段关联的值——

我的网址

127.0.0.1:8000/app_prtg/descarga/P79COL01

我的Url定义

router.register(r'descarga',MyExampleViewSet)
我的模型

class Equipos(models.Model):

    id_equipo=models.PositiveSmallIntegerField(primary_key=True)
    nombre=models.CharField(max_length=15)
    vendedor=models.CharField(max_length=10,default='S/A',blank=True)
    ip_gestion=models.GenericIPAddressField(protocol='Ipv4',default='0.0.0.0')
    tipo=models.CharField(max_length=8,default='S/A',blank=True)
    localidad=models.CharField(max_length=5,default='S/A',blank=True)
    categoria=models.CharField(max_length=10,default='S/A',blank=True)
    ultima_actualizacion=models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'Equipos'

class Puertos(models.Model):

    id_puerto=models.PositiveIntegerField(primary_key=True)
    nombre=models.CharField(max_length=25)
    ultima_actualizacion=models.DateTimeField(auto_now=True)

    class Meta:
        db_table='Puertos'

class Interfaces(models.Model):

    id_interface=models.PositiveIntegerField(primary_key=True)
    id_EquipoOrigen=models.ForeignKey(Equipos,on_delete=models.DO_NOTHING,related_name='equipo_origen')
    id_PuertoOrigen=models.ForeignKey(Puertos,on_delete=models.DO_NOTHING,related_name='puerto_origen',
                                      null=True,blank=True)
    estatus=models.BooleanField(default=False)
    etiqueta_prtg=models.CharField(max_length=80,null=True,blank=True)
    grupo=models.PositiveSmallIntegerField(default=0,blank=True)
    if_index=models.PositiveIntegerField(default=0,blank=True)
    bw=models.PositiveSmallIntegerField(default=0,blank=True)
    bw_al=models.PositiveSmallIntegerField(default=0,blank=True)
    id_prtg=models.PositiveSmallIntegerField(default=0,blank=True)
    ospf=models.BooleanField(default=False)
    description=models.CharField(max_length=200,null=True,blank=True)
    id_EquipoDestino=models.ForeignKey(Equipos,on_delete=models.DO_NOTHING,related_name='equipo_destino')
    id_PuertoDestino=models.ForeignKey(Puertos,on_delete=models.DO_NOTHING,related_name='puerto_destino')
    ultima_actualizacion=models.DateTimeField(auto_now=True)

    class Meta:
        db_table='Interfaces'
我的序列化程序

class EquipoSerializer(serializers.ModelSerializer):

    class Meta:
        model=Equipos
        fields=('id_equipo','nombre','vendedor','ip_gestion','tipo','localidad','categoria','ultima_actualizacion',)

# class NestedEquipoSerializer(serializers.ModelSerializer):

#     class Meta:
#         model = Equipos
#         fields = ('id_equipo', 'nombre', 'localidad', 'categoria',)        

# Serializando los Datos del Modelo Equipo_Interface(Registros)

class PuertoSerializer(serializers.ModelSerializer):

    class Meta:
        model=Puertos
        fields=('id_puerto','nombre','ultima_actualizacion')

class InterfaceSerializer(serializers.ModelSerializer):
# Las siguientes lineas me permiten agregan campos de otros modelos al modelo en cuestion que estoty serializando a traves de llaves foraneas.
#Se le agrega la propiedad de read_only=True para que el campo no sea editable.
    EquipoOrigen = serializers.CharField(source='id_EquipoOrigen.nombre',read_only=True)
    PuertoOrigen = serializers.CharField(source='id_PuertoOrigen.nombre',read_only=True)
    LocalidadOrigen=serializers.CharField(source='id_EquipoOrigen.localidad',read_only=True)
    CategoriaOrigen=serializers.CharField(source='id_EquipoOrigen.categoria',read_only=True)
    EquipoDestino = serializers.CharField(source='id_EquipoDestino.nombre',read_only=True)
    PuertoDestino = serializers.CharField(source='id_PuertoDestino.nombre',read_only=True)
    LocalidadDestino=serializers.CharField(source='id_EquipoDestino.localidad',read_only=True)
    CategoriaDestino=serializers.CharField(source='id_EquipoDestino.categoria',read_only=True)
    Vendedor=serializers.CharField(source='id_EquipoOrigen.vendedor',read_only=True)
    class Meta:
        model=Interfaces
        fields=('id_interface','id_EquipoOrigen','EquipoOrigen','id_PuertoOrigen','PuertoOrigen','LocalidadOrigen','CategoriaOrigen','Vendedor','estatus','etiqueta_prtg','grupo','if_index','bw','bw_al','id_prtg','ospf','description','id_EquipoDestino','EquipoDestino','id_PuertoDestino','PuertoDestino','LocalidadDestino','CategoriaDestino','ultima_actualizacion',) 


我的视图生成excel,我应该在哪里处理URL中的内容并获取P79COL01的值

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
    queryset = Interfaces.objects.all()
    serializer_class = InterfaceSerializer
    renderer_classes = (XLSXRenderer,)
    filter_class=InterfacesFilter
    filename = 'my_export.xlsx'
更新:多亏了朋友Arpit Svt的帮助,我才能够用他的答案解决问题,这样就可以创建一个过滤器,根据发生在他身上的参数生成我的excel,在我的例子中,我想打印EquipoOrigen属性,它是一个字符串,这不是因为它的id。通过使用带有Django REST框架的REST API来生成excel报告是一种非常简单的方法。更新后的代码如下:

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
        serializer_class = InterfaceSerializer
        renderer_classes = (XLSXRenderer,)
        filename = 'my_export.xlsx'

        def get_queryset(self):
                queryset = Interfaces.objects.all()
                name = self.request.query_params.get('name', None)
                if name is not None:
                    queryset = queryset.filter(id_EquipoOrigen__nombre=name)
                return queryset
发生的url

我得到的Excel


如果要按P79COL01筛选数据,应将其传递到查询参数中,如
127.0.0.1:8000/app\u prtg/descarga/?name=P79COL01
,您可以在视图中使用
self.request.query\u params
访问查询参数

因此,您可以重写get_queryset方法以返回过滤后的queryset

这是更新后的代码

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
    serializer_class = InterfaceSerializer
    renderer_classes = (XLSXRenderer,)
    filter_class=InterfacesFilter
    filename = 'my_export.xlsx'

    def get_queryset(self):
        queryset = Interfaces.objects.all()
        name = self.request.query_params.get('name', None)
        if name is not None:
            queryset = queryset.filter(name=name)
        return queryset

如果要按P79COL01筛选数据,应将其传递到查询参数中,如
127.0.0.1:8000/app\u prtg/descarga/?name=P79COL01
,您可以在视图中使用
self.request.query\u params
访问查询参数

因此,您可以重写get_queryset方法以返回过滤后的queryset

这是更新后的代码

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
    serializer_class = InterfaceSerializer
    renderer_classes = (XLSXRenderer,)
    filter_class=InterfacesFilter
    filename = 'my_export.xlsx'

    def get_queryset(self):
        queryset = Interfaces.objects.all()
        name = self.request.query_params.get('name', None)
        if name is not None:
            queryset = queryset.filter(name=name)
        return queryset

如果您想通过
P79COL01
过滤数据,您应该在查询参数中传递它,如
127.0.0.1:8000/app_prtg/descarga/?name=P79COL01
什么是P79COL01?P79COL01是与我的序列化模型接口的EquipoOrigen字段关联的值如果您想通过
P79COL01
过滤数据,您应该在查询参数中传递它如
127.0.0.1:8000/app_prtg/descarga/?name=P79COL01
什么是P79COL01?P79COL01是与序列化模型接口的设备字段相关联的值它起作用了,这正是我所寻找的。但我有一个疑问,在函数的参数中,我必须放置一些属于接口模型的字段,比如Id_EquipoOrigen,问题是我想放置的不是Id_EquipoOrigen(模型团队的模型接口中的外键),而是属性或属性“nombre”对于Equipo模型,InterfacesInterfaceSerializer Serializer中的EquipoOrigen字段已解析。使用双下划线语法应该做什么,在本例中,名称替换为id_EquipoOrigen___nombre,其中id_EquipoOrigen是外键,并将我们要检查的属性命名为。我希望它能为更多的人服务。它奏效了,正是我所期待的。但我有一个疑问,在函数的参数中,我必须放置一些属于接口模型的字段,比如Id_EquipoOrigen,问题是我想放置的不是Id_EquipoOrigen(模型团队的模型接口中的外键),而是属性或属性“nombre”对于Equipo模型,InterfacesInterfaceSerializer Serializer中的EquipoOrigen字段已解析。使用双下划线语法应该做什么,在本例中,名称替换为id_EquipoOrigen___nombre,其中id_EquipoOrigen是外键,并将我们要检查的属性命名为。我希望它能为更多的人服务。