Как отсортировать по наличию M2M (пример пиццы)

Допустим, у меня есть пример обычной пиццы:

class Topping(models.Model):
    order = models.IntegerField()
    name = models.CharField(max_length=250)

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping)

Со следующими начинками:

Topping.objects.create(order=1, name="tomato")
Topping.objects.create(order=2, name="cheese")
Topping.objects.create(order=3, name="olives")
Topping.objects.create(order=4, name="salami")
Topping.objects.create(order=5, name="onion")
Topping.objects.create(order=6, name="rocket")

Допустим, у меня есть пицца с tomato, cheese и salami. Я хочу получить список всех начинок пиццы в соответствии с topping__order, а также список всех начинок, которых в ней нет, также упорядоченный по topping__order. Таким образом, сортировка будет осуществляться, во-первых, по тому, где у пиццы есть начинка, а во-вторых, по полю topping__order.

Результатом будет нечто, содержащее такую же информацию, как эта (возможно, в наборе запросов):

{
    { "id": 1, "name": "tomato", "has_topping": True},
    { "id": 2, "name": "cheese", "has_topping": True},
    { "id": 3, "name": "salami", "has_topping": True},
    { "id": 2, "name": "olives", "has_topping": False},
    { "id": 5, "name": "onion" , "has_topping": False},
    { "id": 6, "name": "rocket", "has_topping": False},
} 

Возможно ли это сделать через запрос к базе данных? (Я могу сделать это вручную в python с помощью двух запросов)

Вы можете сделать это с помощью функции .order_by():

Pizza.objects.all().order_by('id', 'toppings__order')
Вернуться на верх