Связь между моделями ManyToMany через промежуточную модель
Нужно построить связь между моделями ManyToMany через промежуточную модель для рассылки писем
Делаю рассылку писем для подписчиков. Письма отправляются при добавлении нового поста. Не могу добраться от Post до Category (связь идет через PostCategory).
model.py:
class Post(models.Model):
postCategory = models.ManyToManyField(Category, through='PostCategory')
...
class PostCategory(models.Model):
postThrough = models.ForeignKey(Post, on_delete=models.CASCADE)
categoryThrough = models.ForeignKey(Category, on_delete=models.CASCADE)
class Category(models.Model):
name = models.CharField(max_length=64, unique=True)
subscribers = models.ManyToManyField(User, blank=True, related_name='subscription', verbose_name='Подписчики')
Сама рассылка:
@receiver(post_save, sender=Post)
def notify_users_post(sender, instance, created, **kwargs):
pass
В instance получаем созданный объект, в данном случае объект Post. Чтобы сделать рассылку, нужно получить id или названия категорий для данного поста. Далее перебираем подписчиков данных категорий и рассылаем им уведомления на почту.
Вопрос: как добраться до категории через instance?
Ответы (2 шт):
В вашем случае стоит задача использовать PostCategory в качестве промежуточной модели? Насколько я помню, в джанго можно реализовать это проще, она сама создаст промежуточную таблицу при миграции. Приложу ссылку из документации, где подробно расписан процесс связи MtM. Достаточно будет двух моделей Post и Category https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/
categories = Category.objects.filter(postcategory__postThrough=instance) # находим категории данного поста
subscribers_mail = []
for category in categories: # перебираем категории
for sub in category.subscribers.values('email'): # перебираем email подписчиков
subscribers_mail.append(sub['email']) # на выходе получаем список адресов для рассылки