如何正确过滤逆转ManyToMany?

时间:2016-04-19 09:35:10

标签: python django python-2.7 django-models

我无法弄清楚如何过滤ManyToMany中的反转Django。我想获得LanguageLevel个对象,与至少一个UserProfile相关联。

在人类中:所有语言(例如至少一个用户)都可以说这种语言。

我有一个模特:

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

2 个答案:

答案 0 :(得分: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(...)

答案 1 :(得分:0)

您无法使用django orm按M2M字段进行过滤。相反,您可以遵循此解决方法,

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