Django - 模型 - 访问 class 中字段的值

Django - models - access a value of a field within a class

class Tag(models.Model):
    '''Items have tag will have according discount percentage'''

    tag_discount_percentage = models.IntegerField()

    slogan_default = 'Purchase NOW for extra {}% off!'.format(tag_discount_percentage.get_prep_value(value))

    slogan = models.CharField(max_length=200, default=slogan_default)

    def __str__(self):
        return self.slogan

此代码引发异常:

slogan_default = 'Purchase NOW for the extra {}% off!'.format(tag_discount_percentage.get_prep_value(value)) NameError: name 'value' is not defined

急!

问题 1:如何访问 class 中字段自身的值?或者有没有更好的方法来设置 CharField 的默认值?

tag_discount_percentage 本身是 <django.db.models.fields.IntegerField> 但我想要值


问题 2:我可以将数字限制设置为 IntegerField 吗?我发现的只是 max_length 提示警告说 'max_length will be ignored'...

尝试回答问题 1:

我不确定这是否是最佳答案,但它解决了问题。似乎不可能(或者我根本不知道如何)访问 class 中字段的值所以我想到了别的东西:

class Tag(models.Model):
    '''Items have tag will have according discount percentage'''
    tag_discount_percentage = models.IntegerField(default=0)
    slogan = models.CharField(max_length=200, blank=True)

    def __str__(self):
        return self.slogan if self.slogan else self.slogan_default

    @property
    def slogan_default(self):
        return 'Purchase NOW for the extra {}% off!'.format(self.tag_discount_percentage)

嗯.. 如果有人能回答问题 2,我将不胜感激。 干杯~

回答你的第二个问题 - "digit limitation" 你的意思并不明显。如果您有兴趣防止值超出定义的范围,则可以使用 validators:

from django.core.validators import MaxValueValidator, MinValueValidator

class Tag(models.Model):
    '''Items have tag will have according discount percentage'''
    tag_discount_percentage = models.IntegerField(default=0, validators=[MinValueValidator(1), MaxValueValidator(100)])

否则,如果您打算限制小数位数,那么您应该使用 decimal 字段而不是整数。

此外,评论您的第一个问题 - 您根本无法设置与另一个字段的值相关的默认值,因为在保存实例(记录)时,字段值尚未设置。 default agrument 可以是可调用的,但不引用它所使用的对象。您可以考虑使用 pre_save 信号而不是根据其他字段设置字段值 "by default"。