Django,你如何将模型中字段的值设置为其中一个字段的哈希值?

时间:2017-11-10 04:40:00

标签: django

这就是我的模型:

class Alert(models.Model):
    hash = models.CharField(max_length=64, unique=True)
    raw_line = models.TextField()
    alert_datetime = models.DateTimeField()
    datetime_dismissed = models.DateTimeField(null=True)

当我创建一个Alert时,我将哈希值设置为某个东西。但是,我读到我可以有效地做到这一点:

hash = models.CharField(max_length=64, unique=True, default=some_hash_function)

def some_hash_function():
    ...
    return some_hash

但是我想要的哈希依赖于raw_line,是否可以将函数hash设置为raw_line并默认设置它?

一些额外的背景:

我尝试过以下操作:

class Alert(models.Model):
    hash = models.CharField(max_length=64, unique=True, default=hash_raw_line)
    raw_line = models.TextField()
    alert_datetime = models.DateTimeField()
    datetime_dismissed = models.DateTimeField(null=True)

    def hash_raw_line(self):
        return hashlib.sha256(self.raw_line).hexdigest()

但似乎无法找到hash_raw_line的引用

1 个答案:

答案 0 :(得分:1)

您可以通过覆盖save()模型的Alert方法来实现此目的:

class Alert(models.Model):
hash = models.CharField(max_length=64, unique=True, default=None)
raw_line = models.TextField()
alert_datetime = models.DateTimeField()
datetime_dismissed = models.DateTimeField(null=True)

def save(self, *args, **kwargs):
    if self.hash is None:
        self.hash = hashlib.sha256(self.raw_line).hexdigest()
    super().save(*args, **kwargs)  # Call the "real" save() method.

请注意,default = None已添加到hash字段。