根据Django中另一个查询返回的对象数量进行过滤

时间:2017-07-18 13:29:13

标签: django django-queryset

我的模型PaintingHit中有两个类。

class Painting(models.Model):
    objectNumber = models.CharField(max_length=128)

class Hit(models.Model):
    painting = models.ForeignKey(Painting)

通过这种方式,每幅画可以连接到多个点击,但每个点击只能连接到一幅画。

我希望选择与3个或更少点击相关的每幅画。我怎么能这样做?

可能的解决方案:

我想我可以做一些for循环...

for painting in Painting.objects.all():
    if len(Hit.objects.filter(painting=painting)) > 4:
        # and then append it to a list or something

...但我认为我可以申请一些我无法找到的原生过滤器。或者我可以在Painting添加一个字段来计算与其相关的点击次数,但这似乎不合逻辑。

2 个答案:

答案 0 :(得分:0)

您可以使用select_related。为此,您必须为您Hit模型

声明related_name
class Hit(models.Model):
    painting = models.ForeignKey(Painting, related_name='paintings')

然后在绘画模型上使用select相关

Painting.objects.all().select_related('painting')

这将为您提供查询集。现在,您可以应用lencount等任何操作,但现在无需循环。对于您的情况,您可以链接任何注释或过滤器来计算命中数。

注意:如果你有ManyToMany字段而不是外键字段,那么prefetch_related就可以了。

答案 1 :(得分:0)

您需要查看queryset注释。您可以为每幅绘画添加点击次数,然后根据点击次数(docs)过滤绘画。

from django.db.models import Count

Painting.objects.annotate(num_hits=Count('hit')).filter(num_hits__lte=3)