Django - Как обновить статус одной модели в методе сохранения другой модели
У меня есть две модели
''' class JobPosition(models.Model): ... position_status = models.CharField(choices=POSITION_STATUS)
class Outreach(models.Model): ... outreach_status = models.CharField(choices=OUTREACH_STATUS, max_length=20) position = models.ForeignKey('action.JobPosition', on_delete=models.CASCADE, related_name='feelers') '''
Я хочу, чтобы в любой момент времени статус_позиции вакансии был самым высоким из статусов аутрич_статусов аутричей, которые связаны с ней (щупы). Где "наивысший" задается моим произвольным правилом, которое мы можем игнорировать.
Я думаю переопределить метод сохранения модели outreach и сделать так, чтобы при изменении статуса outreach я вызывал обновление статуса в модели jobposition, чтобы обновить статус позиции.
Однако, я понимаю, что в рамках безопасного метода, статус аутрича все еще не обновляется в БД, поэтому если я вызову что-то на модели вакансии, это не сработает.
Есть другие идеи? Я могу сделать все в методе аутрич, но это должна быть уродливая функция, и я надеялся, что есть лучший способ в рамках модели jobposition.
class Outreach(models.Model):
...
outreach_status = models.CharField(choices=OUTREACH_STATUS, max_length=20)
position = models.ForeignKey('action.JobPosition', on_delete=models.CASCADE, related_name='feelers')
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
JobPosition.objects.filter(position=self.position).update(position_status='status')
Вы можете добавить отдельный метод к вашей модели. Это имеет смысл, поскольку сохраняет код, связанный с моделью, вместе с моделью.
class JobPosition(models.Model):
...
position_status = models.CharField(choices=POSITION_STATUS)
def update_position_status(self):
#get the top value of related outreaches
#This is assuming your status choices have integer equivalents, and the 'top' is the highest value
top_feeler = self.feelers.all().order_by("-outreach_status").first()
self.position_status = top_feeler.outreach_status
self.save()
Затем вы можете вызвать метод update из функции сохранения вашей модели Outreach (и в других местах, если необходимо, без необходимости повторять это)
class Outreach(models.Model):
...
def save(self, *args, **kwargs):
#save the status so everything is up to date
super().save(*args, **kwargs)
#call the job position update function to re-evaluate the position
self.position.update_position_status()