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()
Вернуться на верх