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()
如果用户评估事物(给出速率(,我想自动计算平均水平并保存以在物品中。如何制作?
你可以做
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()
如果要使用信号,则可以执行以下
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()
另外,您可以覆盖Rate
中的save
方法在没有信号的情况下执行此操作。看起来更像:
class Rate(models.Model):
# ...
def save(self, *args, **kwargs):
super(Rate, self).save(*args, **kwargs)
# Logic to update the average rating here