2015-04-14 35 views
0

我們有自定義的用戶模型,每個實例都有多個興趣點。如何加快django queryset的排序?

這裏是興趣模型:

class Interest(models.Model): 
    name = models.CharField(max_length=50, unique=True) 
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, 
            related_name="interests", blank=True) 

當用戶將頁面,我們建議用誰擁有最常見的利益相對該用戶的其他人聯繫。

對於用戶生成列表,我們使用:用戶模式

def suggested_people(user): 
    queryset = User.objects.custom_filter(is_verified=True).exclude(pk=user.pk).order_by('-date_joined').select_related() 
    users_sorted = sorted(queryset, key=lambda x: x.get_common_interest(user).count(), reverse=True) 
    return users_sorted 

方法:

def get_common_interest(self, user): 
    """ Return a list of string with the interests and the total number remaining """ 
    your_interests = user.interests.values_list('pk', flat=True) 
    return self.interests.filter(pk__in=your_interests) 

但有這個列表是非常緩慢排序(問題1000個用戶約8秒)。有可能以某種方式簡化或加快排序? 將不勝感激的任何建議!

回答

1

假設我們有一個名爲作爲我們要顯示的建議u傳入的用戶,那麼查詢將是:

from django.db.models import Count 

interests_ids = u.interests.values_list('id', flat=True) # select ids of incoming user interests 
suggestions = User.objects 
        .exclude(id=u.id) # exclude current user 
        .filter(is_verified=True) # filter only verified users 
        .filter(interests__id__in=interests_ids) # select users based on common interests 
        .annotate(interests_count=Count('interests')) # count numbers of interests for each user after filtering 
        .order_by('-interests_count') # order users by max common interests 

suggestions查詢集將不包含不共享任何共同的任何用戶用戶的興趣u。如果您仍然希望在上述查詢沒有建議的情況下顯示一些建議,則可以根據其他一些條件過濾用戶,例如居住在同一個國家或城市的用戶。

+0

太棒了!非常感謝! – aphex

相關問題