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

时间:2018-07-05 15:52:57

标签: django django-rest-framework django-views signals django-users

我的项目是一个社交网站,可以将请求发送给朋友并结交朋友。 我已经使用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()

任何帮助将不胜感激!!!!!预先谢谢你!

1 个答案:

答案 0 :(得分:0)

您每次结交朋友时都要初始化一个Profile的新实例。相反,您可以使用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调用对查询起作用并更新列表中的所有实例