首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新FloatField: Django

如何更新FloatField: Django
EN

Stack Overflow用户
提问于 2018-07-05 18:40:08
回答 2查看 632关注 0票数 0

我试图用我的视图中新计算的值更新我的模型中的字段,当我试图使用total.objects.update(total=total)更新我的字段时,这就是我得到的'decimal.Decimal' object has no attribute 'objects'

我还有其他一些问题,我目前正在使用save()方法从创建项目时输入的初始值中计算总字段。这是个好主意吗还是有更好的方法来做这件事?我目前这样做的原因是因为我显示了带有初始值的项目列表。

总之,我想做一个工具盘存系统。我还有些其他的顾虑。

如何对多项类型使用此视图?模型项是包含所有公共字段的抽象模型,每个工具类型继承该模型,并将使用相同的操作、计算新的cantidad_existente和更新总字段。有更好的办法吗?

我的views.py

代码语言:javascript
复制
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 })

我的models.py

代码语言:javascript
复制
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
                                        )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-05 20:47:20

错误是,您有两个名为total的变量。改个名字就行了。

代码语言:javascript
复制
total = Cortadores.objects.filter(pk=pk).values('total')
...
new_value = nce * pu
total.objects.update(total=new_value)
票数 0
EN

Stack Overflow用户

发布于 2018-07-05 20:14:46

有一个错误,您将queryset更改为flaot值,然后尝试在其上使用queryset函数,因此您应该使用其他变量,而不是您自己的queryset。

代码语言:javascript
复制
total = Cortadores.objects.filter(pk=pk).values('total')
total = nce * pu // This line replace your queryset to float
total.objects.update(total=total)

你应该用这样的方法

代码语言:javascript
复制
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()

若要按需要使用它作为泛型,请使用传递类引用作为参数,并使用它调用查询集。

代码语言:javascript
复制
def something(__class__):
    class.objects.all()

编辑:创建一个泛型方法以用于任何类

代码语言:javascript
复制
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)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51197939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档