这些是 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'
)
我试图通过这种方法来实现这一目标,但没有成功。我对此还比较陌生,并且在许多概念上仍处于初学者水平。我将感谢您的指导。
您听到了错误的信号。
相反,您应该监听 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'
)