编写 Django 信号来记录模型中的用户活动

问题描述 投票:0回答:1

这些是 models.py 文件中我的模型。

class User(AbstractUser):
    date_of_birth = models.DateField(blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    job = models.CharField(max_length=250, blank=True, null=True)
    photo = models.ImageField(upload_to='account_images/',blank=True, null=True)
    phone = models.CharField(max_length=11, blank=True, null=True)
    followings = models.ManyToManyField('self', through='Contact', related_name='followers', symmetrical=False)

    def get_absolute_url(self):
        return reverse('social:user_detail', args=[self.username])


class Post(models.Model):

    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_posts')
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    tags = TaggableManager(blank=True)
    likes = models.ManyToManyField(User, related_name='liked_post', blank=True)
    saved_by = models.ManyToManyField(User, related_name='saved_post', blank=True)
    total_likes = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['-created']
        indexes = [
            models.Index(fields=['-created'])
        ]

    def __str__(self):
        return self.author.username

    def get_absolute_url(self):
        return reverse('social:post_detail', args=[self.id])

class UserActivity(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_activity')
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post_activity', blank=True, null=True)
    action = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user} {self.action} {self.post.author}' post"

我想编写一个信号,其中当用户喜欢某个帖子时,会创建一个 UserActivity 模型的对象,并将 user 字段的值设置为喜欢该帖子的用户。帖子字段应设置为用户喜欢的帖子。并且操作字段应设置为“喜欢”。

@receiver(post_save, sender=Post.likes.through)
def create_like_activity(sender, instance, **kwargs):
    if instance.likes.exists():
        UserActivity.objects.create(
            user=instance.likes.last(),
            post=instance.author,
            action='likes'
        )

我试图通过这种方法来实现这一目标,但没有成功。我对此还比较陌生,并且在许多概念上仍处于初学者水平。我将感谢您的指导。

python django django-signals
1个回答
0
投票

您听到了错误的信号。

相反,您应该监听 m2m_changed 信号。

请注意,此信号会被多次触发/发送

“pre_add”在将一个或多个对象添加到关系之前发送。

“post_add”在一个或多个对象添加到关系后发送。

“pre_remove” 在从

中删除一个或多个对象之前发送

关系。 "post_remove" 在删除一个或多个对象后发送

从关系来看。 “pre_clear”在关系清除之前发送。

“post_clear”关系清除后发送。

您可以通过检查

action
来检查此信号何时被触发。

行动:

行动 指示对关系进行的更新类型的字符串。

所以,你的代码应该如下所示:


@receiver(m2m_changed, sender=Post.likes.through)
def create_like_activity(sender, instance, action, **kwargs):
    if instance.likes.exists() and action === "post_add":
        UserActivity.objects.create(
            user=instance.likes.last(),
            post=instance.author,
            action='likes'
        )
© www.soinside.com 2019 - 2024. All rights reserved.