如何从模型中访问模型字段值?

时间:2016-03-21 19:15:42

标签: python django django-models

我想知道,如何在单个模型中将一个字段值传递给另一个字段值。我需要过滤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过滤器评分?

1 个答案:

答案 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)