2016-04-19 94 views
0

我不知道如何篩選Django中的ManyToMany。我想獲得LanguageLevel對象,至少與一個UserProfile連接。如何正確過濾反轉ManyToMany?

在人類中:所有語言(如至少一個用戶)都會說這種語言。


我有一個模型:

class LanguageLevel(models.Model): 
    ... 

class UserProfile(models.Model): 
    ... 
    language_levels = models.ManyToManyField('LanguageLevel', blank=True, related_name='translators') 
    ... 

已經嘗試過:

active_language_levels = LanguageLevel.objects.filter(lambda x: len(x.translators)!=0) 

for language_level in LanguageLevel.objects.all(): 
     print language_level.translators 
     if len(language_level.translators)>0: 
      print 'ok' 
      print language_level 
     else: 
      print 'no' 
      print language_level 

回答

1

我認爲你正在尋找的東西是這樣的:

from django.db.models import Count 

LanguageLevel.objects.all() \ 
       .annotate(translators_count=Count('translators__id')) \ 
       .filter(translators_count__gte=1) 

只需添加上translators__id適當的鏈路計算每個用戶的不同條目。

如果您要選擇針對特定用戶的語言,只是編序之前,通過適當的查詢集:

LanguageLevel.objects.filter(translators__id=user_id) 
       .annotate(...) 
0

您無法使用django orm通過M2M字段進行過濾。相反,你可以按照此解決方案,

LanguageLevel.objects.all().values('language_levels__id')

+0

它產生異常,我會自己檢查異常,但我完全不明白這是怎麼工作的。異常值:\t 無法將關鍵字'language_levels'解析爲字段。選擇是:id,language,language_id,level,level_id,price_multiplier,譯者 –

+0

對不起,它的'UserProfile.objects.all()。values('language_levels__id')' –

+0

哦,是的,它確實有道理。謝謝! –