Django中的整数字段数学

1 投票
6 回答
8078 浏览
提问于 2025-04-15 18:28
from django.db import models
from django.contrib.auth.models import User

class Product(models.Model):
name = models.CharField(max_length = 127)
description = models.TextField()
code = models.CharField(max_length = 30)
lot_no = models.CharField(max_length = 30)
inventory = models.IntegerField()
commited = models.IntegerField()
available = models.IntegerField()
reorder = models.IntegerField()
created_date = models.DateField(auto_now_add = True)
comment_user = models.ForeignKey(User, null=True)
comment_txt = models.TextField()

def __unicode__(self):
    return self.code + " - " + self.name + " - " + self.lot_no + " - " + str(self.created_date)

@property
def available(self):
    return self.inventory - self.commited

我想在一个人输入库存数据并在Django管理模板中提交时,计算可用数量,公式是(库存 - 自己)。但是我不太确定该怎么做。

谢谢,
Jon

6 个回答

1

Don说得对,你的名字available重复了,因为你有一个字段和一个属性。你可以把字段去掉。

这就是我在你最初的问题中给你解决方案时说的 - 我明确提到过“去掉现有的‘available’字段”。只听一半的解决方案是没办法解决问题的。

不过,我根本不同意Seth和Don的看法,他们建议重写save()函数来计算这个值。这完全是多余的数据重复。使用属性才是正确的解决办法。

3

试着在模型上重写 save 方法:

def save(self, *args, **kwargs):
    "update number available on save"
    self.available = self.inventory - self.committed

    super(Product, self).save(*args, **kwargs)

你也可以在这里添加一些逻辑,比如如果 self.available 变成负数时要做些什么。

2

看起来你可能遇到了两个问题:一个是可用性属性和字段重叠,另一个是可用性在管理界面中没有按你预期显示。

你需要选择一种方式(属性或字段)来表示可用性,然后坚持使用这一种。Don 和 Seth 展示了如何使用字段来实现,而 Daniel 和 Ignacio 则建议使用属性。

既然你真的希望这个字段在管理界面中显示,那就选择字段吧;给它添加一个有用的帮助文本 help_text="...",去掉 @property,并重写 save() 方法。

class Product(models.Model):
    # ...
    availability = models.IntegerField(help_text="(updated on save)")

    # Use Seth's save()
    def save(self, *args, **kwargs):
        self.availability = self.inventory - self.commited
        super(Product, self).save(*args, **kwargs)

虽然这样做在数据规范化方面不是最好的方法,但这可能是解决你当前问题的最简单方案。

如果你使用的是 trunk 而不是 Django-1.1.1,你还可以在管理界面中使用 readonly_fields。

撰写回答