Ошибка типа: неподдерживаемые типы операндов для : ‘DateField’ и ‘datetime.timedelta’

#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 ?

5. 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) косвенно.