Milano
Milano

Reputation: 18715

Django - how to filter ManyToMany relations?

There is a Translator model in my project. This model has ManyToManyField languages_verified (verbose_name='users_languages_verified') and languages_not_verified. I want to get all Language objects which are at at least one languages_verified set.

So if translator x and y:

x.languages_verified = ['FR','EN']
x.languages_not_verified = ['RU','SK']
y.languages_verified = ['RU']
y.languages_not_verified = ['SK','CZ']

Then the output would be ['FR','EN','RU'] (not 'SK' nor 'CZ' because they are not in at least one languages_verified set)

It would be possible to do that for example this way:

lang_ver_set = []
for language in Language.objects.all():
    for translator in Translator.objects.all():
        if language in translator.languages_verified():
            lang_ver_set.append(language)
            break

But I'm not sure if this is a most efficient way how to do that. Django has many magic filter tricks like verbose_name__in... which could be probably faster but I can't find the solution.

Upvotes: 0

Views: 59

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599510

You should just be able to use the reverse relationship.

Language.objects.exclude(users_languages_verified=None)

Upvotes: 1

Related Questions