Как получить запись через ссылку ManyToMany

Я хочу получить email ресторана через модель заказа. Как я могу это сделать?

Мой models.py:

class Order(models.Model):
    cart_meal = models.ManyToManyField(CartMeal, null=True, blank=True)

class CartMeal(models.Model):
    meal = models.ForeignKey(Meal, verbose_name='Meal', on_delete=models.CASCADE)

class Meal(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, null=True)

class Restaurant(models.Model):
    email = models.EmailField()

Мне нужно попасть в restaurant.email через заказ. Я пытался сделать это таким образом, но это не работает: order.cart_meal.model.meal.restaurant.email

Может быть несколько Restaurant, так как Order может содержать несколько блюд, которые производятся разными Restaurant

Вы можете получить QuerySet связанных Restaurant с помощью:

Restaurant.objects.filter(
    meal__cartmeal__order=order
).distinct()

Таким образом, мы можем получить адреса электронной почты этих Restaurant с помощью:

Restaurant.objects.filter(
    meal__cartmeal__order=order
).values_list('email', flat=True).distinct()

Таким образом, получается итерабельность адресов электронной почты Restaurant относящихся к данному заказу.

Вы можете, например, использовать это для вызова функции типа cooking_meal_notification:

qs = Restaurant.objects.filter(
    meal__cartmeal__order=order
).values_list('email', flat=True).distinct()

for email in qs:
    cooking_meal_notification(email)

Вы также можете работать с Meal, которые являются "членами" Order:

qs = Meal.objects.filter(
    cartmeal__order=order
).select_related('restaurant')

for meal in qs:
    cooking_meal_notification(meal.restaurant.email, meal)
Вернуться на верх