Many of you might be using case statement in SQL. How do we do this in Django ?
Let us first look at an example of SQL Case statement
SELECT
blog_product.id,
blog_product.name,
blog_product.price,
blog_product.category
FROM blog_product
WHERE blog_product.id IN (4, 2, 1, 3, 5)
ORDER BY
CASE
WHEN blog_product.id = 4 THEN 1
WHEN blog_product.id = 2 THEN 2
WHEN blog_product.id = 1 THEN 3
WHEN blog_product.id = 3 THEN 4
WHEN blog_product.id = 5 THEN 5
ELSE NULL
END ASC;
To handle this in django, below is the solution:
from django.db.models import Case, When
from .models import Product, Order
# Notice how we want to sort the products by the ids of the orders
order_ids = [4, 2, 1, 3, 5]
products = Product.objects.all()
preferred = Case(
*(
When(order__id=id, then=pos)
for pos, id in enumerate(order_ids, start=1)
)
)
products_sorted = products.filter(order__id__in=order_ids).order_by(preferred)