我有这些模特:
# this is model for user
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
profilepic = models.ImageField(blank=True)
city = models.ForeignKey(City)
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.user.username)
super(UserProfile, self).save(*args, **kwargs)
def __unicode__(self):
return self.user.username
@property
def avg_rating(User):
return UserProfile.userrating_set.all().aggregate(Avg('rating'))['rating__avg']
# this is the model for user ratings - one to many relationship with User
class UserRating(models.Model):
user = models.ForeignKey(User)
comment = models.CharField(max_length=500)
for_username = models.CharField(max_length=128)
rating = models.IntegerField(default=5)
def __unicode__(self):
return unicode(self.rating)
我想在模板中引用属性(avg_rating)的结果,这样我就可以显示每个用户的评分。我试过这个它显示空白结果:
{% for user in users %}
{{ user.profile.avg_rating }}
此外,这是被调用的视图:
def index(request):
user_list = User.objects.select_related().order_by('-userrating')[:5]
city_list = City.objects.order_by('-name')[:5]
context_dict = {"users": user_list, "cities" : city_list}
return render(request, "index.html", context_dict)
我目前正在通过Django学习,对不起,如果非常明显的话。
答案 0 :(得分:3)
User
的{{1}}参数根本没用过。尝试将其重写为:
avg_rating
你也可以删除def avg_rating(self):
return self.user.userrating_set.all().aggregate(Avg('rating'))['rating__avg']
装饰器,因为你也可以使用相同的语法(即没有@property
)在Django模板中使用方法,例如:
()
答案 1 :(得分:2)
UserRating与User相关,而不是UserProfile。您需要针对该模型进行查询。
但请注意,由于需要为每个用户提供额外的查询+聚合,因此您执行此操作的方式非常昂贵。相反,您应该通过适用于查询集中所有元素的annotation
方法在视图中执行查询。
def index(request):
user_list = User.objects.select_related().annotate(
rating=Avg('userrating__rating')
).order_by('-rating')[:5]
现在,您可以通过模板中的{{ user.rating }}
来引用每个用户的评分。
答案 2 :(得分:0)
1) def avg_rating之类的东西喜欢设置为Manager方法。为UserProfile(例如UserProfileManager)创建Manager类以处理UserProfile模型的所有查询可能更好。 avg_rating定义更倾向于使用此UserProfileManager。
2) avg_rating定义与UserProfile有关,因此它应该作为UserProfile方法调用而不是User方法。
3) 在为User rating创建UserRating类时,在UserProfile类中设置avg_rating可能会造成混淆。