我正在尝试使用视图中新计算的值来更新模型中的字段,当我尝试使用total.objects.update(total=total)
更新字段时,这就是我得到的'decimal.Decimal' object has no attribute 'objects'
。
我还有其他一些问题,我目前正在使用save()方法根据创建项目时输入的初始值来计算总字段。这是一个好主意吗 ?还是有更好的方法呢?我目前这样做的原因是因为我显示了带有初始值的项目列表。
总的来说,我试图建立一个工具库存系统。我还有其他一些担忧。
如何在多个项目类型上使用此视图?模型项是一个包含所有公共字段的抽象模型,每种工具类型都将继承此模型并将使用相同的操作,计算新的cantidad_existente并更新总字段。有没有更好的办法?
我的views.py
def calcular_nueva_cantidad(ce, up):
total = ce + up
return total
class updateForm(forms.Form):
update = forms.IntegerField()
def actualizar_cantidad(request, pk):
# trae de la base de datos el valor de la cantidad existente
cantidad_existente = Cortadores.objects.filter(pk=pk).values('cantidad_existente')
c = cantidad_existente.values_list('cantidad_existente', flat=True)
ce= c[0]
# trae de la base de datos el valor de precio_unitario
precio_unitario = Cortadores.objects.filter(pk=pk).values('precio_unitario')
p = precio_unitario.values_list('precio_unitario', flat=True)
pu =p[0]
# trae de la base de datos el valor de la total
total = Cortadores.objects.filter(pk=pk).values('total')
print(F'el precio unitario es {total} ----------------------------------------------------')
if request.method =='POST':
form = updateForm(request.POST)
if form.is_valid():
up = form.cleaned_data['update']
nce = calcular_nueva_cantidad(up, ce)
total = nce * pu
print(F' el nuevo total es {total} -----------------------')
# nce.save()
cantidad_existente.update(cantidad_existente=nce)
total.objects.update(total=total)
return render(request, 'inventario/cortadores.html', {'nce':nce})
else:
# Redirect to fail page after POST
return HttpResponse('')
else:
form = updateForm()
return render(request, 'inventario/update-cortador.html', {'form':form, 'cantidad_existente':cantidad_existente })
我的模型。py
class Item(models.Model):
description = models.CharField(max_length=30,)
numero_parte = models.CharField(max_length=30)
proveedor = models.ForeignKey(Proveedor, on_delete=models.CASCADE)
cantidad_existente = models.PositiveIntegerField()
update = models.PositiveIntegerField(blank=True, default=0)
cantidad_minima = models.PositiveIntegerField()
precio_unitario = models.DecimalField(max_digits=5, decimal_places=2)
total = models.FloatField(blank=True)
asignado_a = models.ForeignKey(Empleados, on_delete=models.CASCADE, blank=True, null=True)
anaquel = models.CharField(max_length=2, choices=ANAQUEL, blank=True, null=True)
posicion_en_x = models.CharField(max_length=2, blank=True, null=True)
posicion_en_y = models.CharField(max_length=2, blank=True, null=True)
activo = models.BooleanField()
class Meta:
abstract = True
def save(self,*args,**kwargs):
self.total = self.cantidad_existente * self.precio_unitario
super().save(*args,**kwargs)
class Cortadores(Item):
tipo = models.ForeignKey(Tipos_Cortadores,on_delete=models.CASCADE)
material = models.ForeignKey(Materiales, on_delete=models.CASCADE)
filos = models.CharField(max_length=5, choices=GABILANES)
diametro = models.ForeignKey(Diametros, on_delete=models.CASCADE)
longitud = models.ForeignKey(Longitud, on_delete=models.CASCADE)
desbaste = models.CharField(max_length=1, choices=DESBASTE)
class Meta:
verbose_name_plural = "Cortadores"
def get_absolute_url(self):
return reverse('inventario:cortadores-list', kwargs={'id': self.id})
def __str__(self):
return '%s %s %s %s %s %s' % ( str(self.tipo), str(self.material), str(self.filos), str(self.diametro),
self.longitud, self.desbaste
)
答案 0 :(得分:0)
错误是您有两个名为total
的变量。只需重命名其中之一即可。
total = Cortadores.objects.filter(pk=pk).values('total')
...
new_value = nce * pu
total.objects.update(total=new_value)
答案 1 :(得分:-1)
出现错误,您将queryset更改为flaot值,然后尝试在其上使用queryset函数,因此应总共使用其他变量,而不要使用自己的queryset
total = Cortadores.objects.filter(pk=pk).values('total')
total = nce * pu // This line replace your queryset to float
total.objects.update(total=total)
您应该使用类似的东西
qs_total = Cortadores.objects.filter(pk=pk).values('total')
total = calcular_nuevo_total(nce, pu)
for value in qs_total:
value.total=total
value.save()
要将其作为通用名称使用,请使用传递类引用作为参数,然后使用它来调用查询集
def something(__class__):
class.objects.all()
编辑:制作可与任何类一起使用的通用方法
from .models import Cortadores, OtherModelExample
def generic_update_noreturn(__class__, pk, total)
qs= __class__.objects.filter(pk=pk).values('total')
for value in qs:
value.total=total
value.save()
return qs
def generic_update_noreturn(__class__, pk, total)
__class__.objects.filter(pk=pk).values('total')update(total=total)
def actualizar_cantidad(request, pk):
...
total = calcular_nuevo_total(nce, pu)
updated_cortadores=generic_update(Cortadores, pk, total)
updated_otherexample=generic_update(OtherModelExample, total, pu)
generic_update_noreturn(Cortadores, pk, total)