gpt4 book ai didi

Django Rest Framework View get_queryset 被调用两次

转载 作者:行者123 更新时间:2023-12-04 22:56:53 27 4
gpt4 key购买 nike

我有这个 ModelViewset 和一个 ModelSerializer

class GenerarFacturaViewset(viewsets.ModelViewSet):
serializer_class = serializer.FacturaSerializer

def get_queryset(self):
self.queryset = []


_nro = self.request.query_params.get('nro', None)
venta_id = self.request.query_params.get('ventaid', None)

if (venta_id is None or _nro is None):
raise exceptions.ParseError("Parametros invalidos")

nro = int(_nro)
venta = models.Venta.objects.get(id=venta_id)

if models.Factura.objects.filter(numero=nro):
raise exceptions.ParseError("Ya existe una factura con ese numero")

venta.generar_factura(nro)
print("Factura generada con nro: ", nro)

self.queryset = models.Factura.objects.filter(numero=nro)

return self.queryset

然后当第一次调用这个 ModelViewset 时,每次都正常工作,直到返回语句,然后再次调用 get_queryset 方法。我想知道为什么?

其他细节是,当在第一个 get_queryset 调用中引发第二个异常时,这显示为 rest 框架普通模板,但如果在第二个调用中引发,它会显示在带有回溯和错误消息的 django 错误模板中。

提前致谢

编辑:我找到了一个最好的方法来做我想要的
Linovia 的答案是正确的,然后我改进了一些东西。

为了澄清,我需要两个参数“venta_id”和“numero”来创建对象“factura”。在我的第一次尝试中,我尝试从请求数据中获取这些参数,验证它并调用模型方法来创建对象。所有关于 get_queryset 方法。但我认为这不是一个好方法。

然后我为这个海豚创建了一个新 View 和一个序列化程序。
class AddProductoViewset(viewsets.ModelViewSet):
serializer_class = serializer.AddProductoSerializer
queryset = models.Venta.objects.all()
http_method_names = ['post', 'head']

def create(self, request, *args, **kwargs):
venta_id = request.data.get('venta_id', None)
producto_id = request.data.get('producto_id', None)
cantidad = request.data.get('cantidad', None)

serializer_r = serializer.AddProductoSerializer(data=request.data)
if (serializer_r.is_valid(raise_exception=True)):
print("Datos validos")
venta = models.Venta.objects.get(id=venta_id)

if models.Venta.productos.filter(id=producto_id):
vpd = VentaProductoDetalle.objects.filter(venta_id=venta_id, producto_id=producto_id)[0]
vpd.cantidad += int(cantidad)
vpd.save()
else:
vpd = VentaProductoDetalle()
vpd.venta = venta
vpd.producto = models.Producto.objects.get(id=producto_id)
vpd.cantidad = int(cantidad)
vpd.save()
queryset = models.Venta.objects.get(id=venta_id)
serializer_r = serializer.VentaSerializer(queryset)
return Response(serializer_r.data)

序列化器类:
class PostFacturaSerializer(serializers.Serializer):

venta_id = serializers.IntegerField()
numero = serializers.IntegerField()

class Meta:
model = models.Factura

def validate(self, attrs):

try:
venta_id = attrs['venta_id']
numero = attrs['numero']

except KeyError as e:
print("Error: ", e)
raise serializers.ValidationError(
"Campos no recibidos correctamente")


if (models.Factura.objects.filter(numero=numero)):
print("ya existe")
raise serializers.ValidationError(
"Ya existe una factura con ese nombre"
)

return attrs

然后我删除了 get_queryset 覆盖方法,不再需要它了。

现在,你怎么看,我在序列化器上验证数据,所以我只是在 View 的 create 方法上调用 is_valid 方法。我认为这是最好的方法。

P.D:为我的英语不好而道歉。

最佳答案

Then when this ModelViewset is called the first time every work correctly until the return sentence then the get_queryset method is called again. I want to know why?



如果您使用的是 BrowsableAPI,它会调用 get_queryset再次以显示表格。

Other detail is that when the second exception is raised in the first get_queryset call, this is show as rest framework normal template but if it is raised in the second called, it is show in the django error template with the traceback and error messages.



不知道那个。这可能表明您在处理初始异常的过程中遇到了另一个异常。
然而, get_queryset不应该引发异常。

关于Django Rest Framework View get_queryset 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com