我有一个简单的模型,我想在其中包含模型id的哈希:
class pick(models.Model):
id_hash = models.TextField(default=hashlib.md5(id).hexdigest())
symbol = models.CharField(max_length=5)
buy_datetime = models.DateTimeField()
buy_price = models.DecimalField(max_digits=8, decimal_places=2)
sell_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
buy_quantity = models.IntegerField()
current_price = models.DecimalField(max_digits=8, decimal_places=2)
def hash(self):
return hashlib.md5(str(self.id)).hexdigest()
def __str__(self):
return "{} {} {} {} {} {}".format(self.symbol,self.buy_datetime,self.buy_price,self.sell_price,self.buy_quantity, self.current_price)
当然对于id_hash,我无法访问模型类中的id
。有什么方法可以尝试达到同样的效果吗?
答案 0 :(得分:2)
您可以覆盖save
方法,因为id
是从数据库自动生成的,您必须保存至少两次 -
class pick(models.Model):
id_hash = models.TextField(default="")
symbol = models.CharField(max_length=5)
buy_datetime = models.DateTimeField()
buy_price = models.DecimalField(max_digits=8, decimal_places=2)
sell_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
buy_quantity = models.IntegerField()
current_price = models.DecimalField(max_digits=8, decimal_places=2)
def hash(self):
return hashlib.md5(str(self.id)).hexdigest()
def __str__(self):
return "{} {} {} {} {} {}".format(self.symbol,self.buy_datetime,self.buy_price,self.sell_price,self.buy_quantity, self.current_price)
def save(self, *args, **kwargs):
with transaction.atomic():
super().save(*args, **kwargs)
# for python < 3.0 super(pick, self).save(*args, **kwargs)
self.id_hash = self.hash()
super().save(*args, **kwargs)
# for python < 3.0 super(pick, self).save(*args, **kwargs)
但还有另外一个解决方案,如果你只需要id_hash
只用于python而不是在db中搜索它,那么你不需要保存它,你可以使用{{1}像这样的哈希值 -
property
答案 1 :(得分:0)
您希望覆盖模型的create方法,以便在初始保存后写入id_hash。我假设你不想多次写id_hash。例如,可能像
class PickManager(models.Manager):
def create(**kwargs):
instance = super(PickManager, self).create(**kwargs)
instance.id_hash = hashlib.md5(instance.id).hexdigest()
instance.save()
class Pick(models.Model):
id_hash = models.TextField(blank=True)
...
objects = PickManager()
此外,您应该将您的型号(Pick)大写,并且可能使用 unicode 而不是 str 。