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管理模板中提交时,我试图通过(库存 - 自我)计算得到。但我不确定如何。
谢谢, 乔恩
答案 0 :(得分: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
变为负数,你也可以在那里放置逻辑。
答案 1 :(得分: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,你也可以在admin中使用readonly_fields。
答案 2 :(得分:1)
您已将Django字段和vanilla Python属性绑定到模型上的相同名称。其中一个属性掩盖了另一个属性,这就是你在Django管理员中遇到意外行为的原因。这几乎肯定是不是你想要的。
覆盖保存方法并完全删除def available
属性。
Ignacio正试图通过不将数据存储在数据库中两次来帮助您保持数据的标准化。在一般情况下遵循这是一个很好的做法,但有很多时候你想在数据库中存储计算值。这似乎是数据重复的实际用途。
答案 3 :(得分:1)
唐是正确的,你有一个名称available
重复,因为你有一个字段和一个属性。放下场地。
这就是我在original question给你解决这个问题的方法时所说的 - 我明确地说“放弃现有的'可用'字段”。以下一半解决方案永远不会起作用。
但是我从根本上不同意Seth和Don建议覆盖save()函数来计算这个值。这是完全不必要的重复数据。该属性是正确的解决方案。
答案 4 :(得分:0)
该属性实际上是从管理页面中删除可用的整数字段
答案 5 :(得分:0)
请参阅Django文档model properties