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"。
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"。