Search code examples
djangodjango-modelsdjango-querysetdjango-q

How can I use Django Querysets and Q() to compare against objects of the same model type?


I have a Django model named MyModel. m is an instance of MyModel. I would like to use Django QuerySets to find all the instances of MyModel that are not m. How to do it? This doesn't work:

MyModel.objects.filter(~Q(m))

It seems you can query against attributes of MyModel using Q(). However I don's see how I can use Q to include/exclude instances of MyModel itself. Is this doable? If so, how? If not, what is the most efficient and elegant way to get at what I'm trying to do?


Solution

  • Use the model's pk (primary key) field:

    MyModel.objects.exclude(pk=m.pk)
    

    To exclude another model n also (additional question asked in comment below), you could do:

    MyModel.objects.exclude(pk=m.pk).exclude(pk=n.pk)
    

    More generally, to exclude a list of instances list_of_instances, use the __in syntax:

    MyModel.objects.exclude(pk__in=[instance.pk for instance in list_of_instances])