我在表格中提供了有關公司的資訊。該表的一個欄位是公司收到的每張票據的平均值(models.FicheIdentification 中的“note_moyenne”)。通過單擊按鈕,人們可以為公司提交新的注釋(models.EvaluationGenerale 中的“注釋”)。我希望每次有人提交新筆記時在資料庫中更新筆記的平均值。
這是我的 models.py :
class FicheIdentification(models.Model):
entreprise=models.ForeignKey(Entreprise, on_delete=models.CASCADE)
note_moyenne=models.IntegerField()
def __str__(self):
return self.entreprise.nom_entreprise
class EvaluationGenerale(models.Model):
entreprise=models.ForeignKey(Entreprise, on_delete=models.CASCADE)
note=models.IntegerField()
commentaires=models.CharField(max_length=1000)
date_evaluation=models.DateField(auto_now_add=True)
def __str__(self):
return self.commentaires
視圖.py:
class CreerEvaluationGenerale(CreateView):
form_class = FormulaireEvaluationGenerale
model = EvaluationGenerale
def form_valid(self, form):
form.instance.entreprise=Entreprise.objects.filter(siret=self.kwargs['siret']).first()
return super(CreerEvaluationGenerale, self).form_valid(form)
def get_success_url(self):
return reverse('details-evaluations')
目前我只是使用這個在我的表中顯示平均值
def render_evaluation(self, record):
return (EvaluationGenerale.objects.filter(entreprise=record.entreprise.siret).aggregate(Avg('note'))['note__avg'])
但我真的不喜歡這個解決方案,因為我希望將值存盤在 FicheIdentification.note_moyenne 的資料庫中。
我想過創建一個 UpdateView 類,但無法將它與我的 CreateView 鏈接起來。
任何幫助或檔案將不勝感激,我有點迷失了,知道...
uj5u.com熱心網友回復:
我看到了兩種方法。
要么是 EvaluationGenerale ( doc )上的偵聽器 post_save 。每次在 DB 中輸入新的 EvaluationGenerale 時,您都可以計算新的平均值。
@receiver(post_save, sender=EvaluationGenerale)
def evaluation_general_note_moyenne_computer_post_save_listener(sender, instance, **kwargs):
entreprise = instance.entreprise
entreprise.note_moyenne = entreprise.evaluationgeneral_set.aggregate(Avg('note')).values()[0])
entreprise.save()
保存后監聽器只會觸發 oninstance.save()而models.objects.create()不是 on queryset.update()or model.objects.bulk_create()。
在創建新的 EvaluationGenerale 后覆寫表單的保存 ( doc ) 函式以計算平均值
def save(self):
instance = super.save()
entreprise = instance.entreprise
entreprise.note_moyenne = entreprise.evaluationgeneral_set.aggregate(Avg('note')).values()[0]
entreprise.save()
return instance
uj5u.com熱心網友回復:
假設FicheIdentification每個企業有一個物件,您可以note_moyenne在保存物件時更新欄位EvaluationGenerale,例如:
obj = FicheIdentification(...)
FicheIdentification.objects.filter(entreprise=record.entreprise.siret).update(note_moyenne=obj.aggregate(Avg('note'))['note__avg']
obj.save()
請讓我知道它是否有效。
uj5u.com熱心網友回復:
通常,您不會存盤計算欄位。通常的方法不是存盤平均值,而是在查詢中使用注釋/聚合。
要將其集中到您的模型中,您可能需要撰寫一個自定義模型管理器來實作它,因此它可以在您使用模型的任何地方重用,而無需重寫邏輯。
class MyModelManager(models.Manager):
def note_average(self, **filter_kwargs):
qs = self.get_queryset()
# replace `...` with your aggregation as needed
return qs.filter(**filter_kwargs).aggregate(...)
class EvaluationGenerale(models.Model):
objects = MyModelManager() # override the default manager
# ... the rest of the model as-is
然后,您可以在視圖中使用類似以下內容:
EvaluationGenerale.objects.note_average(entreprise=record.entreprise.siret)
有關其他參考,請參閱:如何將計算欄位添加到 Django 模型
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/529750.html
標籤:django
上一篇:根據用戶組過濾視圖
