Получение последнего дополнения в сигнале m2m_changed в Django - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать сигнал m2m_changed в Django для создания уведомления о том, когда сообщение «понравилось».Прямо сейчас у меня есть сигнал post_save, работающий для создания уведомления для комментария.В моей функции сигнала m2m_changed печать набора запросов для лайков в сообщении pre_add и post_add показывает добавление пользователя, которому понравилось сообщение при отправке сигнала, т.е. pre = QuerySet [пользователь: TestUser] и post = QuerySet [пользователь: TestUser, Пользователь: test_user].

Какой метод я могу вызвать на instance.likes для возврата пользователя, связанного с этим сигналом m2m_changed?Или я могу вызвать метод diff для наборов запросов pre и post, чтобы вернуть этого пользователя?Я хочу создать уведомление по

Notification.objects.create (post = экземпляр, пользователь = ?????, избранное = True, date_posted = ?????)

А также, есть ли способ, которым я могу установить date_posted для уведомления равным дате и времени отправки сигнала?

class Notification(models.Model):
    post = models.ForeignKey('photo_blog.Post', on_delete=models.CASCADE, null=True, blank=True)
    comment = models.ForeignKey(Comment, on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    liked = models.BooleanField(default=False)
    date_posted = models.DateTimeField(null=True, blank=True)


@receiver(post_save, sender=Comment)
def auto_create_comment_notification(sender, instance, created, **kwargs):
    if created:
        Notification.objects.create(post=instance.post, comment=instance, date_posted=instance.date_posted)


@receiver(m2m_changed, sender=Post.likes.through)
def auto_create_like_notification(sender, instance, action, **kwargs):
if action == "pre_add":
    print(instance.likes.all())
if action == "post_add":
    print(instance.likes.latest())

Модель My Post выглядит следующим образом:

class Post(models.Model):
    photo = models.ImageField(upload_to=get_image_path, null=True, blank=True)
    caption = models.TextField(max_length=2200, null=True, blank=True)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    location = models.CharField(max_length=100, blank=True)
    likes = models.ManyToManyField(User, blank=True, related_name='post_likes')

    def __str__(self):
        return self.caption

    def get_absolute_url(self):
        return reverse('photo_blog-detail', kwargs={'pk': self.pk})

    def get_api_like_url(self):
        return reverse('photo_blog-post_like_api', kwargs={"pk": self.pk})

    def save(self):
        super().save()

        img = Image.open(self.photo.path)

        output_size = (450, (img.height / img.width) * 450)
        img.thumbnail(output_size)
        img.save(self.photo.path)
...