использование инструкции if внутри модели django, которая обновляет модель при достижении порогового значения

#python #django #if-statement #django-models

#python #django #if-statement #django-модели

Вопрос:

Пожалуйста, потерпите меня, поскольку я новичок в Django

У меня в модели есть таблица, в которой мне нужно установить таймер. Если достигнут предел таймера, мы соответствующим образом обновляем строку столбца.

Это моя модель

 class Question(models.Model):

    date = models.DateTimeField(auto_now_add=True, verbose_name=_('date'
                                ))
    first_name = models.CharField(max_length=255,
                                  verbose_name=_('first name'),
                                  blank=True)
    last_name = models.CharField(max_length=255,
                                 verbose_name=_('last name'),
                                 blank=True)
    email = models.EmailField(max_length=255,
                              verbose_name=_('email address'),
                              blank=True)
    phone = models.CharField(max_length=255, verbose_name=_('phone'),
                             blank=True)
    extra = models.CharField(max_length=255, verbose_name=_('extra'),
                             blank=True)
    subject = models.CharField(max_length=255, verbose_name=_('subject'
                               ), blank=True)
    message = models.TextField(max_length=1000,
                               verbose_name=_('question'))
    relevance = models.BooleanField(default=True,
                                    verbose_name=_('relevance'))
    marketing_consent = models.BooleanField(default=False,
            verbose_name=_('marketing consent'))

    expert = models.ForeignKey(Expert, on_delete=models.SET_NULL,
                               null=True, blank=True,
                               verbose_name=_('expert (target)'))
    analysis_tags = models.ManyToManyField(AnalysisTag, blank=True,
            verbose_name=_('analysis tags'))

    predicted_experts = models.ManyToManyField(Expert,
            through='AssociatedExpert', related_name='predicted_for',
            blank=True)
    public_token = models.CharField(max_length=50,
                                    default=generate_token,
                                    db_index=True, unique=True,
                                    verbose_name=_('public token'))

    STATE_CHOICES = (
        ('W', 'Waiting'),
        ('D', 'Declined'),
        ('T', 'Taken'),
        ('A', 'Answered'),
        ('F', 'Feedback'),
        ('P', 'Pending'),
        ('C', 'Cancelled'),
        )
    state = models.CharField(max_length=10, choices=STATE_CHOICES,
                             default='P', verbose_name=_('state'))
  

Что я хочу сделать, так это добавить следующее, но я не уверен, подходит ли модель для добавления метода ниже, а также, правильно ли я это пишу.

Обновление: я хочу проверить в фоновом режиме и пометить вопросы как Cancelled , если вопросы достигают срока 48 минут

 def value(self):
48_mn_ago = now() - timedelta(minutes=48)
if self.date > 48_mn_ago and self.state == 'P':
    return self.state = 'C', self.first_name = '***', self.last_name = '***'
  

Большое спасибо за вашу помощь.

Ответ №1:

Более чем нормально иметь пользовательские методы или свойства, работающие с экземпляром в вашей модели, их можно использовать как обычные классы Python. Но я немного не уверен, что вы пытаетесь сделать взамен. Если вам нужно изменить объект (строку), вы должны изменить его поле и вызвать self.save()

 def update_if_rotten(self):
    48_mn_ago = now() - timedelta(minutes=48)
    if self.date > 48_mn_ago and self.state == 'P':
        self.state = 'C'
        self.first_name = '***'
        self.last_name = '***'
        self.save()
  

Использование:

 question = Question.objects.create(...)
question.update_if_rotten()
  

Комментарии:

1. Привет @cepbuch, пожалуйста, взгляните на мое обновление и спасибо за ваш ответ.

2. @andy-k, не могли бы вы, пожалуйста, объяснить: вы хотите выполнить эту проверку в процессе создания объекта (и изменить его в некоторых случаях) — т. Е. Как часть проверки данных. Или вы хотите проверять это каждый раз, когда объект сохраняется (изменяется любое поле)? Или, может быть, вы хотите, чтобы он постоянно проверялся, как в «фоновом режиме»?

3. Если это последнее, я предполагаю, что вы не можете сделать это полностью автоматически. Вы должны либо запускать команду Django (например, каждую минуту), которая проверяет ваши вопросы. Или вы должны обновить доступность в своем представлении, когда возвращается список вопросов.. Я нашел случай, похожий на ваш здесь: reddit.com/r/django/comments/asm09y /…

4. Я хочу проверить в фоновом режиме и пометить вопросы как Cancelled , если вопросы достигают срока 48 минут. Имеет ли это смысл?