2017-04-25 34 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