我是新来的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的我得到