Django - модели - доступ к значению поля в классе - PullRequest
0 голосов
/ 10 февраля 2020
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 = 'Приобретите СЕЙЧАС за дополнительную {}% скидку!'. Формат (tag_discount_percentage.get_prep_value (значение)) NameError: name 'value' не определено

urggg!

Вопрос 1: Как получить доступ к собственному значению поля в этом классе? Или есть лучший способ установить значение по умолчанию для CharField?

tag_discount_percentage само по себе является <django.db.models.fields.IntegerField>, но я хочу значение


Вопрос 2: Могу ли я установить ди git ограничение на IntegerField? все, что я нашел, было max_length, которое выдает предупреждение о том, что 'max_length будет игнорироваться' ...

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Отвечая на ваш второй вопрос - не очевидно, что вы подразумеваете под «ди git ограничение». Если вы заинтересованы в том, чтобы значение не выходило за пределы определенных диапазонов, вы можете использовать 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)])

Иначе, если вы хотите ограничить десятичные разряды, вам следует использовать поле десятичное вместо целого числа.

Также, комментируя свой первый вопрос - вы просто не можете установить значение по умолчанию, связанное со значением другого поля, потому что в момент, когда экземпляр (запись) сохранено, значения полей еще не настроены. default agrument может вызываться, но без ссылки на объекты, для которых он используется. Вместо этого вы можете использовать сигнал pre_save , чтобы установить значение поля «по умолчанию» в зависимости от других полей.

0 голосов
/ 10 февраля 2020

Попытка ответить на вопрос 1:

Я не уверен, что это лучший ответ, но это решило проблему. Кажется, что невозможно (или я просто не знаю, как) получить доступ к значению поля в классе, поэтому я решил что-то еще:

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. Ура ~

...