如何从在Django休息Framwrek一个URL参数采集处理它在视图[解决](How to cap

2019-09-26 14:31发布

我是新来的Django。 我使用Django的REST框架作为API休息,但我需要生成将被从前端(角)通过获得自定义擅长的端点或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

我的网址定义

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

所发生的网址

http://127.0.0.1:8000/app_prtg/descarga/?name=P79COL01

Excel的我得到

Answer 1:

如果你想过滤由P79COL01数据,你应该在查询参数一样传递127.0.0.1:8000/app_prtg/descarga/?name=P79COL01 ,您可以使用访问query_params self.request.query_params的视图中。

所以,你可以重写get_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


文章来源: How to capture parameters from a URL in Django Rest Framwrek to process it in a view [SOLVED]