我想知道,如何在单个模型中将一个字段值传递给另一个字段值。我需要过滤Rating
个对象以获得产品的平均评分,并且我希望它在ProductStat
中以及其他未来的统计信息。
我尝试过滤,由于某些"Models aren't loaded yet"
appregistry错误,我不会让我进行迁移,但如果我将avgRating
注释掉它就可以了。
class ProductStat(models.Model):
productID = models.ForeignKey('Product')
avgRating = models.IntegerField(
default = Rating.objects.filter(product=productID).aggregate(Avg('rating'))['rating__avg']
)
class Rating(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
product = models.ForeignKey('Product')
rating = models.IntegerField(default = 3)
所以我的问题是:如何按ProductStat.avgRating
制作ProductStat.product
过滤器评分?
答案 0 :(得分:1)
解释模型文件时Rating
模型不存在。此外,您不应该使用函数作为默认值,而是使用callable。
def avg_rating():
return Rating.objects.filter(product=productID).aggregate(Avg('rating'))['rating__avg']
class ProductStat(models.Model):
productID = models.ForeignKey('Product')
avgRating = models.IntegerField(
default = avg_rating
)
This answer可以提供帮助。您也可以在Django的页面中查看docs。
如果您需要使用当前ProductStat
对象中的值,则可以使用signal。在 models.py :
from django.db.models.signals import pre_save
class ProductStat(models.Model):
productID = models.ForeignKey('Product')
avgRating = models.IntegerField()
def set_avg_rating(sender, instance, *args, **kwargs):
avg = Rating.objects.filter(product=instance.productID).aggregate(Avg('rating'))['rating__avg']
instance.avgRating = avg
pre_save.connect(set_avg_rating, sender=ProductStat)