Django - обновить значения полей в расширенной модели пользователя после выполнения запроса
Мой проект - это сайт социальной сети, который может отправлять запросы друзьям и заводить друзей. Я расширил существующую модель пользователя 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 ответ
Вы инициализировали новый экземпляр профиля каждый раз, когда у вас появился друг. Вместо этого вы можете использовать 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
вызов действует на запрос и обновляет все экземпляры в списке