如何从Django Rest Framwrek中的URL中捕获参数,以便在视图中对其进行处理
我是Django的新手。我使用Django Rest框架作为Api Rest,但我需要生成一个端点或URL,该端点或URL将从前端(角度)传递,以获得自定义excel 问题是,例如,我将传递以下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.
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是外键,并将我们要检查的属性命名为。我希望它能为更多的人服务。