【问题标题】:Pass additional statement to Django model query将附加语句传递给 Django 模型查询
【发布时间】:2015-08-11 21:03:44
【问题描述】:

我有下一条 Django 语句

def get_companies_with_average_ratings_data(self, city=None, faculty=None):
    companies = Company.objects.values('name', 'id', 'logo_image').annotate(
        recommendations_score=Avg('companyinternshipreview__recommendation')
    ).annotate(
        apply_skills_score=Avg('companyinternshipreview__apply_skills')
    ).annotate(
        learn_new_score=Avg('companyinternshipreview__learn_new')
    ).order_by('-recommendations_score', '-apply_skills_score', '-learn_new_score')

    if city:
        companies = companies.filter(cities__name=city)

    if faculty:
        companies = companies.filter(companyinternshipreview__user__student__faculty__name=faculty)

    return companies

并非所有公司都添加了带有评级的评论,因此对于某些结果,聚合字段将包含 NULL,这会导致排序中断。我首先看到没有评级的公司,而且只有在这些公司按评级排序之后。

我正在使用 PostgreSQL,如果不存在评论,我想使用“COALESCE”返回平均值或 0。如何以 Django ORM 方式将此“COALESCE”传递给 Django 模型查询?我不想使用原始 SQL。

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案1】:

    您正在寻找Coalesce

    from django.db.models import Value
    from django.db.models.functions import Coalesce
    
    companies = Company.objects.values('name', 'id', 'logo_image').annotate(
        recommendations_score=Coalesce(Avg('companyinternshipreview__recommendation'), Value(0.0))
    ).annotate(
        apply_skills_score=Coalesce(Avg('companyinternshipreview__apply_skills'), Value(0.0))
    ).annotate(
        learn_new_score=Coalesce(Avg('companyinternshipreview__learn_new'), Value(0.0))
    ).order_by('-recommendations_score', '-apply_skills_score', '-learn_new_score')
    

    【讨论】:

    • 很酷的功能,但可能只在 Django 1.8 中可用。
    • 您也可以使用extra 来管理它,但这有点复杂,从 1.8 开始已被弃用。
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2011-07-03
    相关资源
    最近更新 更多