首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决以下实现的pythonic方法

解决以下实现的pythonic方法
EN

Stack Overflow用户
提问于 2012-05-21 13:07:51
回答 2查看 169关注 0票数 3

我的django应用程序有3种型号

代码语言:javascript
复制
class Company(models.Model):

    name = models.CharField(_("Name"), max_length = 100, blank = True, null = True)
    address = models.CharField(_("Address"), max_length = 300, blank = True, null = True)

class WebSite(models.Model):

    WEBSITE_TYPE_CHOICES = (
        ('Google+', 'Google+'),
        ('Facebook', 'Facebook'),
        ('Orkut', 'Orkut'),
    )
    user = models.ForeignKey(User)
    website = models.URLField(blank = True, null = True)
    website_type = models.CharField(max_length = 15, choices = WEBSITE_TYPE_CHOICES, default = 'Google+')
    company = models.ForeignKey(Company, null=True, blank=True)

class Review(models.Model):

    rating = models.FloatField(blank = True, null = True) 
    review = models.TextField(blank = True, null = True)
    company = models.ForeignKey(Company, null=True, blank=True)
    website = models.ForeignKey(Website, null=True, blank=True)

我想显示我的数据,例如

CompanyA:

  1. Google-5评论,Avg 3.4
  2. Orkut -9篇评论,Avg 4.1
  3. Facebook - 12篇评论,Avg 4.3
  4. 任何其他-2评论,Avg 2

CompanyB:

  1. 谷歌-2评论,Avg 3
  2. Facebook -5评论,Avg 4

为此,我做了

代码语言:javascript
复制
    final_list = company_list = []
    websites = Website.objects.select_related().filter(user = user)

    for website in websites:
        company = website.company
        if company is not None and company not in company_list:
            company_list.append(brand)
            company_websites = websites.filter(company = company)
            info = []
            for company_website in company_websites:
                company_type = company_website.website_type
                reviews = Review.objects.filter(company = company, website = company_website)
                no_of_reviews = len(reviews)
                average = reviews.aggregate(Avg('rating'))
                info.append({"type": company_type, "no_of_reviews": no_of_reviews,
                             "average": average['rating__avg']})
            final_list.append({"company": company.name, "stats": info})

代码有两个问题

  1. 这浪费了大量的计算。
  2. 它还以某种方式在final_list (BUGGY)中追加空列表。

FYI:我相信.annotate()是可以使用的,但我不明白如何根据列使用.annotate(在我的例子中是company__name)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-21 13:19:07

这会给你数据。

代码语言:javascript
复制
Review.objects.values(company, website__website_type).annotate(review_count=Count('id'), average=Avg('rating')).order_by('company')

使用{%重组%}在模板中输出它。

票数 1
EN

Stack Overflow用户

发布于 2012-05-23 14:52:04

我还没有测试过这个,它可能不如你收到的另一个答案好,但是万一它有帮助.

代码语言:javascript
复制
companies = Company.objects.all()
company_ratings = []

for company in companies:
    websites = company.website_set.filter(user=user)
    new_data = []

    for website in websites:
        reviews = Reviews.objects.filter(website=website, company=company)
        ratings = [x.rating for x in reviews]
        count = len(ratings)
        new_data.append({'website': website, 'count': count, 
                         'average': float(sum(ratings))/count})

    company_ratings.append({'company':company, 'ratings':new_data})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10685848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档