python - 如何从模型内部访问模型字段值?

标签 python django django-models

我想知道如何在单个模型中将一个字段值传递给另一个字段值。我需要过滤 Rating 对象以获得产品的平均评分,并且希望将其与其他 future 统计信息一起显示在 ProductStat 中。

我尝试进行过滤,这不会让我进行迁移,因为一些“模型尚未加载” 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.avgRatingProductStat.product 过滤评级?

最佳答案

解释模型文件时,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可以帮助。您还可以查看docs在 Django 页面中可以找到此信息。

<小时/>

如果您需要使用当前 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)

关于python - 如何从模型内部访问模型字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36139693/

相关文章:

python - Python XML解析和生成中<foo/>和<foo></foo>的区别

Django rest-auth Token 认证

python - 使用 django rest 框架自定义 lookup_field,无法解析细节

django - 根据其他字段在 Django 中的用户模型中自动创建用户名

django - 如何将 Django 模型字段的默认值设置为函数调用/可调用(例如,相对于模型对象创建时间的日期)

python - "import __hello__"是如何工作的?

python2.7 - 从字典中获取值,其中键是变量

Python 性能 - 最佳并行方法

python - 未获取 Django 1.7 迁移

python - Django 忽略构建模型时的额外参数