Как отсортировать по наличию 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')