根据条件从 ForeignKey 中计算元素

问题描述 投票:0回答:1

我有一个视图,它返回所有 Company 对象。在我的 HTML 文件中,我想计算所有在线广告 (

online == True
) 并且属于公司。 在我的文件 companySearch.html 中,所有广告都被计算在内,即使是那些具有
online == False
.

的广告

我正在寻找一种应该具有以下逻辑的方法:

{{ o.ad_set.count where o.ad.online == True }}

views.py

def companySearch(request):
    obj = Company.objects.all()
    
    paginator = Paginator(obj, PAGINATION_NUMBER)
    page_number = request.POST.get('page')
    page_obj = paginator.get_page(page_number)

    context = {'obj': page_obj}
    return render(request, 'core/companySearch.html', context)

models.py

class Company(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=64, blank=False, null=False, unique=True)    


class Ad(models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=128, blank=False, null=False)
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    online = models.BooleanField(default=False)

companySearch.html

{% for o in obj %}
    <div>{{ o.ad_set.count }} open position{{ o.ad_set.count|pluralize:',s' }}</div>
{% endfor %}
django django-models
1个回答
0
投票

ad_set
实际上是一个模型管理器,充当普通的
model.objects
查询集,因此您可以使用以下代码简单地过滤相关实例:

o.ad_set.filter(is_online=True).count()

另一种获取广告的方法是_online=True number 是利用注释功能: (由于 N+1 查询问题,这比上面的答案更推荐)

from django.db.models import Count, Q


obj = Company.objects.annotate(online_ad_count=Count('ad_set', filter=Q(ad_set__is_online=True)).all()

o.online_ad_count # get count number with customized annotate field

有关详细信息,请参阅django doc


你也可以使用 [Prefetch]((https://docs.djangoproject.com/en/4.1/ref/models/querysets/#prefetch-related) 来帮助你解决这些问题,但我认为注释是合格的够了

© www.soinside.com 2019 - 2024. All rights reserved.