保存另一个模型后自动更新一个模型上的字段[Django 1.11][Python3.x]
我正在学习如何在Django上使用post_save信号。虽然我没有得到任何错误,但我想做的不会起作用 我有一个模型,它应该汇总和平均来自审查模型的评分,并将该数字保存在一个名为average_rating的字段中 我希望在用户在Review模型上提供评分后进行平均,并在模型上自动计算和更新平均评分 我知道我可以通过post_保存信号来实现这一点。但我不知道怎么做 我怎样才能做我想做的事 提前谢谢 models.py保存另一个模型后自动更新一个模型上的字段[Django 1.11][Python3.x],python,django,python-3.x,save,signals,Python,Django,Python 3.x,Save,Signals,我正在学习如何在Django上使用post_save信号。虽然我没有得到任何错误,但我想做的不会起作用 我有一个模型,它应该汇总和平均来自审查模型的评分,并将该数字保存在一个名为average_rating的字段中 我希望在用户在Review模型上提供评分后进行平均,并在模型上自动计算和更新平均评分 我知道我可以通过post_保存信号来实现这一点。但我不知道怎么做 我怎样才能做我想做的事 提前谢谢 models.py from django.db import models from djang
from django.db import models
from django.db.models import Func, Avg
from django.urls import reverse
from django.template.defaultfilters import slugify
from django.db.models.signals import post_save
from django.dispatch import receiver
class Model(models.Model):
name = models.CharField(max_length=55, default='')
slug = models.SlugField(unique=True)
average_rating = models.DecimalField(decimal_places=1,
max_digits=2,
default=0.0,
blank=True,
null=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.average_rating = self.review_set.aggregate(
rounded_avg_rating=Round(Avg('rating')))['rounded_avg_rating']
self.slug = (slugify(self.name))
super(Model, self).save(*args, **kwargs)
class Review(models.Model):
RATING_CHOICES = [
(1, '1'),
(2, '2'),
(3, '3'),
(4, '4'),
(5, '5'),
]
model = models.ForeignKey(Model,
null=True)
rating = models.IntegerField(choices=RATING_CHOICES,
default=1)
review_date = models.DateField(auto_now_add=True)
reviewer = models.ForeignKey(User,
null=True,
related_name = 'review_user')
comment = models.TextField(default='')
class Meta:
verbose_name_plural = 'Reviews'
verbose_name = 'Review'
def __str__(self):
return self.model.name
@receiver(post_save, sender=Review)
def update_average_rating(sender, instance, **kwargs):
instance.average_rating = Review.objects.aggregate(
rounded_avg_rating=Round(Avg('rating')))['rounded_avg_rating']
更新:
使用RajKris提供的解决方案,我得到了以下结果:
class Review(models.Model):
....
def save(self, *args, **kwargs):
Model.save(avg_rating_flag=True)
super(Review, self).save(*args, **kwargs)
现在我得到了这个错误:TypeError:save缺少1个必需的位置参数:“self”
RajKris的最新答案解决了我的问题。工作起来很有魅力
def save(self, *args, **kwargs):
super(Review, self).save(*args, **kwargs)
model_obj = self.model
model_obj.average_rating = model_ob.review_set.aggregate(
rounded_avg_rating=Round(Avg('rating')))['rounded_avg_rating']
model_obj.save()
在“查看保存”功能中:
def save(self, *args, **kwargs):
super(Review, self).save(*args, **kwargs)
model_obj = self.model
model_obj.average_rating = model_obj.review_set.aggregate(
rounded_avg_rating=Round(Avg('rating')))['rounded_avg_rating']
model_obj.save()
这里发生的是,每次创建一个review对象时,相应的模型对象都会更新为新的平均评级。感谢您的响应,RajKris。我想在save on Model中执行此操作,但我必须返回管理员并在那里保存模型,然后它才会更新average_rating字段。这就是为什么我在复习时使用post_save信号来更新模型。我需要自动更新,否则我将需要继续返回并保存。我非常乐意在Model.save上执行此操作,如果您能告诉我如何从Review自动更新新的评级,那么您要做的就是保存Review模型。这有意义吗?创建新的审阅对象时,您可以进行此聚合并将其保存到模型中。谢谢,RajKris。晚安