我有一个视图,它返回所有 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 %}
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) 来帮助你解决这些问题,但我认为注释是合格的够了
• 总是为所有模型 ForeignKey 字段定义 list_select_related 是好的做法吗?
• EFCore 拥有的模型具有映射到 foreignKey 的对象属性
• 有没有办法找到 std::tuple 元素是否都是同一类型?
• pandas 如何根据条件从行中取最大值、最小值、平均值
• Django ForeignKey 到一个可能不存在的模型
• 如何计算熊猫列(Dataframe)中重复元素的出现次数? [重复]
• DataFrame 将小于 40% 的行值更新为 NaN 的最有效方式?
• (Django 3.1.6/Python 3.8.7) 在字段或字段集 admin.py 中使用命名方法不起作用?