2017-04-25 63 views
0
class Thing (model.Models): 
    name = models.CharField(max_length = 222) 
    ratee = models.IntegerField(default = 0) 
    ... 

class Rate(models.Model): 
    thing = models.ForeignKey(Thing) 
    user = models.ForeignKey(User) 
    rate = models.IntegerField() 

如果用戶評價的東西(給率率),我想自動計算平均,並保存在事受評者。如何做到這一點?Django的,更新速度,信號

回答

0

你可以做

class Rate(models.Model): 

    def save(self, *args, **kwargs): 
     super(Rate, self).save(*args, **kwargs) 
     self.thing.ratee = Rate.objects.filter(thing=self.thing).aggregate(Avg('rate'))["rate__avg"] 
     self.thing.save() 
+0

我不明白爲什麼,但是當我爲匯率加入匯率時,「匯率」沒有任何反應。任何想法爲什麼? – abcdefghijklmn8

+0

您是否覆蓋了「Thing」保存方法?或者檢查'print Rate.objects.filter(thing = self.thing).aggregate(Avg('rate'))[「rate__avg」]' – itzMEonTV

+0

你是什麼意思「覆蓋事物保存方法」? 打印沒有顯示任何東西 – abcdefghijklmn8

0

如果你想使用一個信號,你可以做以下

from django.dispatch import receiver 
from django.db.models.signals import post_save 
from django.db.models import Avg 
@receiver(post_save, sender=Rate, dispatch_uid="update_rating") 
def update_rating(sender, instance, **kwargs): 
    # Logic to update the rating goes here, for example... 
    avg = Rate.objects.filter(thing=instance.thing) \ 
         .aggregate(Avg('rate')).values()[0] 
    instance.thing.ratee = avg 
    instance.thing.save() 

或者,你可以重寫save方法Rate這樣做沒有信號。這看起來更像是:

class Rate(models.Model): 
    # ... 

    def save(self, *args, **kwargs): 
     super(Rate, self).save(*args, **kwargs) 

     # Logic to update the average rating here 
+0

我不工作。你真的很確定這個解決方案嗎?我需要Rate中的匯率總和,但是您給出了來自Thing的Ratee總和,而不是Rate。這裏的產品是什麼? instance.product.save() – abcdefghijklmn8

+0

已更新的答案。 – user6731765