Django - обновить значения полей в расширенной модели пользователя после выполнения запроса - PullRequest
0 голосов
/ 05 июля 2018

Мой проект - это сайт социальной сети, который может отправлять запросы друзьям и заводить друзей. Я расширил существующую модель пользователя django, используя поле oneToone.

До сих пор я был в состоянии выполнить вышеупомянутое, но когда пользователь принимает запрос, и пользователь, отправивший запрос, и пользователь, принявший его, должны увеличивать значение в своей расширенной пользовательской модели, в которой хранится значение. их друзей считают. Я сталкиваюсь с трудностями, пытаясь решить эту проблему. Я также использовал сигналы, но это не работает.

Вот мой код:

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 голосов
/ 05 июля 2018

Вы инициализировали новый экземпляр профиля каждый раз, когда заводили друга. Вместо этого вы можете использовать get_or_create для создания профиля или получения профиля, связанного с этим идентификатором. Затем вы хотите обновить обоих пользователей, чтобы получить другое обновление счетчиков и сохранить.

@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 воздействует на запрос и обновляет все экземпляры в списке

...