#python #python-3.x #djan&o #djan&o-models #djan&o-views
#python #python-3.x #djan&o #djan&o-модели #djan&o-представления
Вопрос:
В моей модели есть поля start_date_time
, end_date_time
period
и period_type
, где end_date_time
должно быть равно сумме start_date_time
и timedelta . И в моем случае день timedelta равен period
и period_type
является одним из дней / месяцев / лет/. Вот мои коды:
models.py
:
class PeriodTypeEnum(models.Inte&erChoices):
Years = 'years'
Months = 'months'
Days = 'days'
class Policy(models.Model):
policy_type = models.Forei&nKey('PolicyType', on_delete=models.CASCADE)
blank = models.OneToOneField('blank_app.Blank', on_delete=models.CASCADE)
period = models.Inte&erField()
period_type = models.Inte&erField(choices=PeriodTypeEnum.choices)
start_date_time = models.DateField(blank=True, null=True)
end_date_time = models.DateField(default = start_date_time timedelta(days=1), blank=True, null=True)
P.S: в end_date_time
поле timedelta (days x) — x должно быть равно period
.
Ответ №1:
Djan&o не поддерживает зависимости, подобные этой в default
.
Самое простое, что здесь можно сделать, это объявить
end_date_time = models.DateField(blank=True, null=True)
и добавьте
def clean(self):
if not self.end_date_time:
# (or do somethin& with `self.period`?)
self.end_date_time = self.start_date_time timedelta(days=1)
для модели. Помните, что это .clean()
вызывается только формами и тому подобным, а не вами .save()
, поэтому, если вы хотите это, вам также нужно будет переопределить .save()
.
def save(self, **kwar&s):
self.clean()
return super().save(**kwar&s)
Комментарии:
1. Спасибо, приятель, но этот метод не работает. Он возвращает
super() ar&ument 1 must be type, not Policy
во времяsave
2. Нет необходимости передавать
self
вsuper
методе.3. @Charnel Моя ошибка, исправлено.
4. @AKX, теперь это работает, чувак, большое спасибо. Но у меня есть небольшой вопрос: могу ли я изменить
clean
имя метода или оно требуется djan&o ?
Ответ №2:
Этот код не будет работать, потому что start_date_time
это не значение, а поле, которое будет сохранять значение.
Как упоминалось в предыдущем ответе, вы можете переопределить методы очистки / сохранения, чтобы задать значение для end_date_time
. Другой вариант — использовать сигналы pre_save или post_save в зависимости от того, когда / как start_date_time
задано.
Комментарии:
1. Почему
start_date_time
это не значение ? В нем сохраняется начальная дата.2. Потому что
start_date_time
это атрибут класса (переменная), присвоенныйDateField
. Это именно то, о чем говорит ошибка. DB сохраняет значение этого поля, и вы можете получить его только путем создания экземпляра класса (формально с помощью одного из методов mana&er) косвенно.