查找具有多个“子”对象的Django模型记录?

时间:2019-01-29 21:25:46

标签: python django django-models

如果我在Django中有两个模型,$gateways = Import-CSV '.\perlaw.csv' $ports = 22, 80, 8080, 443, 4443, 3389 foreach ($gateway in $gateways) { $scriptblock = { param ( $gateway, $ports, $path ) foreach ($port in $ports) { $result = Test-NetConnection $gateway.'connection gateway' -Port $port; $out = @( $gateway.'group id', $gateway.'connection gateway', $port ) $output = "{0}, {1}, {2}" -f $out if ($result.TcpTestSucceeded) { Out-File -FilePath $path\$($gateway.'group id').csv -InputObject $output -NoClobber -Append; } } } Start-Job -ScriptBlock $scriptblock -ArgumentList $gateway, $ports, (Get-Location).Path } Parent,其中ChildChild具有外键关系,如下所示:

Parent

如何找到所有具有至少两个class Parent(models.Model): parent_name = models.CharField(max_length=128, blank=False, default='no name') class Child(models.Model): child_name = models.CharField(max_length=128, blank=False, default='no name') parent = models.ForeignKey('app.Parent', on_delete=models.CASCADE, null=False) 记录的Parent条记录?理想情况下,该解决方案将在Child上使用单个.filter()语句。

1 个答案:

答案 0 :(得分:1)

您可以注释Child的数量,然后根据该数量进行过滤,例如:

from django.db.models import Count

Parent.objects.annotate(
    nchild=Count('child')
).filter(nchild__gt=1)

这将生成如下查询:

SELECT parent.*, COUNT(child.id) AS nchild
FROM parent
LEFT OUTER JOIN child ON parent.id = child.parent_id
GROUP BY parent.id
HAVING COUNT(child.id) > 1

一个人可以将.filter(..)的条件更改为关于孩子数nchilds的各种条件,例如,nchild=4过滤器上有四个孩子的Parent上,而~Q(nchild=7)将排除所有Parent个正好有七个孩子的孩子。因此,我们可以制作更复杂的过滤器。