#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 минут. Имеет ли это смысл?