【问题标题】:How to pass django model field value as an argument to callable which is default of field in the same model?如何将 django 模型字段值作为参数传递给可调用,这是同一模型中字段的默认值?
【发布时间】:2015-12-07 07:14:36
【问题描述】:

这是我想做的:

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'))

并且不使用哈希字段的默认参数?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您可以在模型的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 我添加了blank=True,这样当用户提交表单时,不会出现错误,因为用户不对哈希负责。它会在后台自动填充,因此永远不会是空白的。我认为您将blank=Truenull=True 混淆了。
    • 我在forms.py 中用fields = ['email'] 定义了我的来源。模型中没有字段有blank=True,并且在用户提交表单时不会产生错误。我尝试明确设置blank=False,仍然没有错误。与null=False 相同。我还尝试删除 save 方法覆盖,仍然是相同的行为。现在我真的很困惑为什么 django 不报告任何错误(即 has 在模型中存储为空字符串 u'')。
    • @dsalaj Django 只报告表单中存在的字段的错误。不用担心,如果一切正常,则无需设置blank=True如果没有损坏,请不要修复它)。我想我让你对这一切感到困惑。 :P 忽略我以前的 cmets。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2010-10-19
    • 2012-08-09
    • 2017-01-28
    • 2017-11-10
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多