Introduction
Let's say that we have to models. A post and a category model like this:
class Post(models.Model):
title = models.CharField(max_length=255)
intro = models.TextField()
body = models.TextField()
class Category(models.Model):
title = models.CharField(max_length=255)
description = models.TextField()
posts = models.ManyToManyField(Post)
Okay. So now imagine that you want to get all posts with "django" in the title + all the posts from a category called django.
posts_with_title = Post.objects.filter(title__icontains='django')
category = Category.objects.get(title='django')
posts_from_category = category.posts.all()
Right now, this will give us all the posts we want, but we still have two QuerySets. So let's merge them.
all_posts = posts_with_title | posts_from_category
So now we only have one QuerySet, but it has all the normal functionality like filtering, distinct, order_by, count and similar.
The problem on the other hand is that we might get many duplicates, so let's remove them as well.
all_posts = all_posts.distinct()
Now we have a variable called "all_posts" with the posts from the django category + other posts with django in the title.