'FilterSet for ManyToMany relationship existence

Basic models:

class ModelA(Model):
    name = CharField(...)


class ModelB(Model):
    model_a = ManyToManyField(ModelA, blank=True)
class ModelBFilter(filters.FilterSet):
    unassigned = BooleanFilter(field_name='model_a', lookup_expr='isnull')

    class Meta:
        model = ModelB
        fields = ['unassigned']

How do I filter (with django-filter) to find the ModelB's that do not have a corresponding related model?



Solution 1:[1]

It looks to me that what you have should work. Perhaps the fields = ['unassigned'] is unnecessary? According to the documentation you can also negate the filter thusly:

class ModelBFilter(filters.FilterSet):
    assigned = BooleanFilter(field_name='model_a', lookup_expr='isnull', exclude=True)

    class Meta:
        model = ModelB

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user1281657