Skip to content
Advertisement

How to filter by a list in Django REST Framework?

Suppose I have a model called X, X contains a field called Ys, a many-to-many field for a class Y.

If I have a list of multiple instances of the model Y, how to filter for Xs that have the field Ys that is a superset of my list?

Example:

I have 3 X objects here:

x1.Ys = [y1, y3, y4]

x2.Ys = [y1, y2, y3]

x3.Ys = [y1, y2]

items_list: [y1, y2]

I want to write X.objects.filter(xxx=items_list) and get x2, and x3 but not x1.

What should I write in place of xxx?

Advertisement

Answer

You can use __in.

For example.

X.objects.filter(Ys__in=items_list)

EDIT: You can try this using annotation

from django.db.models import Count

list_count = len(items_list)
X.objects.filter(YS__in=items_list).annotate(count_ys=Count('Ys')).filter(count_ys=list_count)
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement