Django - 在执行请求后更新扩展用户模型中的字段值

Django - Update field values in extended user model after a request is performed

我的项目是一个社交网站,可以向朋友发送请求并结交朋友。 我已经使用 oneToone 字段扩展了 django 的现有用户模型。

到目前为止我已经能够做到上面所说的事情但是当用户接受请求时,发送请求的用户和接受请求的用户都必须在他们存储的扩展用户模型中增加一个值自己算朋友的价值。 我在尝试解决这个问题时遇到了困难。 我也用过信号,但它不起作用。

这是我的代码:

models.py:

class Friends(models.Model):
"""Model for saving relationship of user and friends"""
     request_id = models.ForeignKey(User,on_delete=models.CASCADE,related_name='current_user')
     friend_id = models.ForeignKey(User,on_delete=models.CASCADE,related_name='user_friend')
     created_on = models.DateTimeField(auto_now_add=True,auto_now=False)

    class Meta:
        verbose_name_plural = "Friends"

    def __str__(self):
        return str(self.friend_id)


class Profile(models.Model):
    user = models.OneToOneField(User,related_name='profile',on_delete=models.CASCADE)
    location = models.CharField(max_length=30,blank=True)
    friends_count = models.PositiveIntegerField(default=0)
    profile_pic = models.ImageField(upload_to='profile_pics/',blank=True,null=True)

    def natural_key(self):
        return (self.user.username,)

signals.py:

    @receiver(post_save,sender=Friends)
    def update_friends_count(sender,instance,created,**kwargs):
        if created:
            user_profile = Profile(user = instance.request_id)
            user_profile.friends_count=F('friends_count')+1
            user_profile.save()

任何帮助将不胜感激!!!!!提前致谢!!!

每次结交朋友时,您都在初始化配置文件的新实例。相反,您可以使用 get_or_create 生成配置文件或检索与该 ID 关联的配置文件。接下来,您想要更新两个用户,因此获取另一个更新计数并保存。

@receiver(post_save,sender=Friends)
def update_friends_count(sender,instance,created,**kwargs):
    if created:
        user_profile, profile_created = Profile.objects.get_or_create(user = instance.request_id)
        user_profile.friends_count=F('friends_count')+1
        user_profile.save()

        friend_profile, profile_created = Profile.objects.get_or_create(user = instance.friend_id)
        friend_profile.friends_count=F('friends_count')+1
        friend_profile.save()

使用 Q 过滤器和更新

Profile.objects.filter(
    Q(user=instance.request_id) | 
    Q(user=instance.friend_id)
).update(
    friends_count=F('friends_count')+1
)

最后一个查询使用 django.db.models Q 对象来创建 SQL OR 语句来检索两个配置文件实例;被请求者和请求者的:update 调用作用于查询并更新列表中的所有实例