Как получить запись через ссылку 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)