【问题标题】:How to access model field value from within the model?如何从模型中访问模型字段值?
【发布时间】:2016-03-21 19:15:41
【问题描述】:

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

【问题讨论】:

    标签: python django django-models


    【解决方案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)
    

    【讨论】:

    • 它适用于makemigrationsqlmigrate,但是当我调用migrate 时,我收到错误NameError: name 'productID' is not defined
    • 哦,抱歉,我没有看到您在那里使用变量,我只是从您的问题中腼腆/粘贴,给我一个编辑的机会。
    • 是的,现在可以了!太感谢了! (你保存了我的学士论文)
    • @Zygro 这很有趣,因为我无法完成我的。对你有好处。
    • 嗯,还有更新的问题(只有在手动保存后,稍后再查看),我稍微摆弄了一下,我真的不记得我做了什么.. .
    猜你喜欢
    • 2020-03-03
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2016-01-03
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多