Django:如何在django中写django信号来更新域?

djmepvbi  于 2022-12-24  发布在  Go
关注(0)|答案(1)|浏览(139)

我想写一个简单的django信号,当我选中一个按钮completed时,它会自动将一个字段的状态从live更改为finished
我有一个模型,看起来像这样\

class Predictions(models.Model):
    ## other fields are here
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    status = models.CharField(choices=STATUS, max_length=100, default="in_review")
  

class PredictionData(models.Model):
    predictions = models.ForeignKey(Predictions, on_delete=models.SET_NULL, null=True, related_name="prediction_data")
    votes = models.PositiveIntegerField(default=0)
    won = models.BooleanField(default=False)

当我选中PredictionData模型中的won按钮时,我想立即将Predictionstatus更改为finished。
注意:我在模型的顶部有一些元组。

STATUS = (
    ("live", "Live"),
    ("in_review", "In review"),
    ("pending", "Pending"),
    ("cancelled", "Cancelled"),
    ("finished", "Finished"),
)
kulphzqa

kulphzqa1#

您可以通过以下方式发出信号:

from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=PredictionData)
def update_prediction(sender, instance, *args, **kwargs):
    if instance.won and instance.predictions_id is not None:
        prediction = self.instance.predictions
        prediction.status = 'finished'
        prediction.save(update_fields=('status',))

注意:信号通常不是一个健壮的机制。我写了an article [Django-antipatterns]来讨论使用信号时的一些问题。因此,你应该把它们作为最后的手段来使用。
注意:通常Django模型的名字是单数,所以Prediction代替了Predictions

相关问题