2017-07-18 77 views
-1

我在我的模型PaintingHit中有两个类。基于Django中另一个查询返回的对象数量进行过滤

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

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

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

我希望选择每个连接3个或更少点击的绘画。我怎样才能做到这一点?

可能的解决方案:

我想我可以做一些对环...

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

...但我相信有我可以申请,我可以”一些本地的过滤器似乎找不到。否则,我可以添加一个字段到Painting以计算与它相关的点击次数,但这似乎不合逻辑。

回答

0

您可以使用select_related。对于这一点,你必须声明related_name你Hit模型

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

然后使用选择上画模型

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

这会给你的查询集有关。现在您可以应用任何操作,如lencount,但现在无需循环。对于您的情况,您可以链接任何注释或过滤器来计算点击次数。

注意:如果您有ManyToMany字段而不是外键字段,然后prefetch_related会做的伎俩。

+0

这也适用于ManyToMany领域? –

+0

select_related仅适用于onetoone和foreignkeyfield。如果你有很多很多的领域,你必须去prefetch_related –

+0

我似乎无法做到。我运行'Painting.objects.all()。prefetch_related('画')''返回一个'AttributeError:在绘画对象上找不到'绘画','画'是一个无效参数prefetch_related()' –

0

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

from django.db.models import Count 

Painting.objects.annotate(num_hits=Count('hit')).filter(num_hits__lte=3) 
相关问题