2017-07-18 80 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) 
相關問題