简体   繁体   English

如何正确过滤掉反向的ManyToMany?

[英]How to properly filter reversed ManyToMany?

I can't figure out how to filter reversed ManyToMany in Django . 我不知道如何在Django过滤反向的ManyToMany I want to get LanguageLevel objects, connected with at least one UserProfile . 我想获得LanguageLevel对象,并与至少一个UserProfile连接。

In human: All languages such as at least one User can speak this Language. 人工语言:所有语言(例如至少一种用户)都可以使用该语言。


I have a model: 我有一个模型:

class LanguageLevel(models.Model):
    ...

and

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

Already tried: 已经尝试过:

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

AND

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

I think you are looking for something like this: 我认为您正在寻找这样的东西:

from django.db.models import Count

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

Just add proper link on translators__id to count distinct entries of each user. 只需在translators__id上添加适当的链接即可计算每个用户的不同条目。

If you want to select languages for specific user, just pass proper queryset before annotate: 如果要为特定用户选择语言,只需在注释前传递正确的查询集即可:

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

You cannot filter by a M2M field using django orm. 您无法使用django orm按M2M字段进行过滤。 Instead you can follow this workaround, 相反,您可以按照以下解决方法进行操作,

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM