【问题标题】:Django - Update field values in extended user model after a request is performedDjango - 执行请求后更新扩展用户模型中的字段值
【发布时间】:2018-07-05 15:52:56
【问题描述】:

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

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

【问题讨论】:

  • 你能纠正缩进和cmets吗?
  • 可以吗!!!!你有什么想法解决这个问题吗??? @JerinPeterGeorge
  • 我认为你必须实现M2M关系而不是FK关系
  • 这将如何解决我的问题...。我想要一个朋友而不是关系...因为如果信号.py 中的方法被清除,一切正常
  • 您为每个实例定义了它,但您需要为整个 Profile 表定义它

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


【解决方案1】:

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

【讨论】:

  • 不客气!我添加了另一种在一个查询中完成它的解决方案
  • 第二个查询使用 Q 对象创建一个OR SQL 查询,更新调用将更新查询返回的所有实例。
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2019-04-22
相关资源
最近更新 更多