如何将Django模型字段的值作为参数传递给该模型中具有默认值的可调用函数?

5

以下是我想要做的事情:

def createNewsletterHash():
    hash = hashlib.sha256()
    hash.update(str(time.time()))
    hash.update(emailValueOfThisModel) # HOW TO DO THIS?
    return hash.hexdigest()

class NewsletterSubscriber(models.Model):
    email = models.EmailField(max_length=70, unique=True)
    hash = models.CharField(default=createNewsletterHash, unique=True)

我假设在对象创建时获取其他字段的值是不可能的。但是有没有更简洁的方法来完成这个操作,而不是在对象创建后设置哈希值或在创建时显式设置它:

NewsletterSubscriber.objects.create(email='email@email.com', hash=createNewsletterHash('email@email.com'))

不使用散列字段的默认参数?
1个回答

3

在您的模型的save方法中,您可以在创建时获取其他字段的值。

class NewsletterSubscriber(...):
    ...
    hash = models.CharField(blank=True, max_length=150)

    def save(self, *args, **kwargs):
        if not self.pk: # this will ensure that the object is new
            self.hash = createNewsLetterHash(self.email)
        super().save(*args, **kwargs)

为什么把空白参数设置为 True?我不希望 hash 字段被留空,如果我总是在创建时填充它,那么允许它为空就没有意义,对吧? - dsalaj
@dsalaj 我添加了 blank=True,这样当用户提交表单时,不会因为用户不负责哈希而引发错误。它将在后台自动填充,因此实际上永远不会为空。我认为你把 blank=Truenull=True 搞混了。 - xyres
我在forms.py中定义了我的表单,其中包含fields = ['email']。模型中没有任何字段设置为blank=True,当用户提交表单时也没有产生错误。我尝试显式地将blank=False设置为False,但仍然没有错误。null=False也是一样。我还尝试删除save方法的覆盖,但行为仍然相同。现在我真的很困惑为什么Django不报告任何错误(即哈希值存储为空字符串u''在模型中)。 - dsalaj
Django仅报告表单中存在的字段的错误。如果一切正常,不必设置blank=True(不破坏它,如果它没有问题)。我想我让你对所有这些感到困惑了。:P 忽略我之前的评论。 - xyres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接