2016-02-02 24 views
6

Bire - kadar çok ilişkisi olan iki model var: A -> {B}. Bir filtre() kullandıktan sonra A ile kaç tane A kaydettiğimi sayıyorum. Ardından, A'nın en üstteki X kayıtlarını onlara bağlı olan en fazla B kaydıyla çıkarmam gerekiyor.Django: Hizalama için alternatif (nokta())

geçerli kod:

class A(models.Model): 
    code = models.IntegerField() 
    ... 

class B(models.Model): 
    a = models.ForeignKey(A) 
    ... 

data = B.objects.all().filter(...) 

top = data.values('a',...).annotate(n=Count('a')).distinct().order_by('-n')[:X]; 

Ben ~ 300k oda kayıtları var ve benim laptop ile bu bir sorgu için ~ 2s alıyor. Sorguyu parçalara ayırdım ve zamanladım ve ana darboğaz annotate().

Django ile bunu daha hızlı yapmak için herhangi bir yolu var mı?

cevap

0

Sorgulamada annotate önce .select_related('a') eklemelisiniz. Bu, django'yu saymadan önce modellere katılmaya zorlayacaktır.

https://docs.djangoproject.com/en/1.9/ref/models/querysets/#select-related

+0

Ben değerlere önce() çağrısı (sonra imkansız), zaman yaklaşık olarak aynı kaldığını yaparsanız. Yoksa bunu filtre() 'den önce yapmam gerekiyor mu, daha sonra bir grup çağrı daha hızlı olacak? – user1581390

+0

'print (data.sql)' ile SQL'e bakmayı denediniz mi? – onlythefinestwilldo