我有一个数据库表,例如重量值,例如
CREATE TABLE product (
id SERIAL NOT NULL,
product_name item_name NOT NULL,
.
.
weight NUMERIC(7,3), -- the weight in kg
.
.
CONSTRAINT PK_product PRIMARY KEY (id)
);
结果是模型:
class Product(models.Model):
.
weight = models.DecimalField(max_digits=7, decimal_places=3, blank=True, null=True)
.
我以kg为单位存储重量,即1 kg存储为1,0.1 kg或100g存储为0.1
为了方便用户,我通过指定:
在管理列表显示中以克为单位显示权重def show_weight(self):
if self.weight:
weight_in_g = self.weight * 1000
return '%0f' % weight_in_g
因此,如果产品重量如0.5千克并且如此存储在数据库中,管理列表显示500
是否还有一种方法可以更改“更改产品”窗口中显示的数字。该窗口现在显示从数据库中提取的值,即0.5。当我告诉他用help_text输入g中的数字,同时看到kgs的数量时,这会让用户感到困惑。
在保存产品之前,我按以下方式覆盖保存:
def save(self):
if self.weight:
self.weight = self.weight / 1000
这会将以克为单位输入的数字转换为kgs。
答案 0 :(得分:1)
像这样的模型的保存方法会产生意想不到的结果,而且可能不是你想要的。你看,每次保存模型时,它的重量都会变小1000倍。
最好添加自定义ModelForm并覆盖ModelAdmin.save_model。在这里,我们去了,灵感的一个小例子(没有以任何方式测试):
class ProductForm(forms.ModelForm):
weight_gramms = forms.IntegerField(...)
class Meta:
model = ProductModel
exclude = ('weight',)
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
if self.instance:
self.initial['weight_gramms'] = int(self.instance.weight * 1000)
class ProductAdmin(admin.ModelAdmin):
form = ProductForm
def save_model(self, request, obj, form, change):
obj.weight = form.cleaned_data['weight_gramms'] / 1000.0
obj.save()
答案 1 :(得分:0)
为什么不使用整数,只存储重量克?