Django - обновить значение целочисленного поля в одной модели путем изменения в другой - PullRequest
0 голосов
/ 16 февраля 2019

Вот проект, который я создал для практики, в моем models.py,

class Post(models.Model):
   title = models.CharField(max_length = 140)
   author = models.ForeignKey(User, on_delete=models.CASCADE)
   votes = models.BigIntegerField(default=0, blank=True)


class Vote(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='voter')
   post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='vpost')

 @receiver(post_save, sender=Vote)
 def update_votes(sender, **kwargs):
    # # ??

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

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

Я знаю, что могу показать его с {{post.vpost.count}} в моем HTML.Но я хочу это приращение здесь.

Другой способ, который я пробовал,

class Vote(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='voter')
   post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='vpost')

 def update_votes(self):
     p = self.post
     p.votes += 1
     p.save()

Этот работает только один раз, не работает во второй раз, поэтому я хочу использовать метод сигнала.Так как же я могу обновить поле голосования в модели Post, используя сигнал?

1 Ответ

0 голосов
/ 16 февраля 2019

Почти там.Я бы переименовал Post.votes в Post.votes_count, так как votes указывает на обратную связь.

@receiver(post_save, sender=Vote)
def update_votes(sender, instance, **kwargs):
    post = instance.post
    post.votes_count += 1
    post.save()

Хотя вы, возможно, захотите убедиться, что счет правильный, введя другой запрос:

@receiver(post_save, sender=Vote)
def update_votes(sender, instance, **kwargs):
    post = instance.post
    post.votes_count = post.votes_set.all().count()
    post.save()

Вы также можете сделать это, когда / если Voteудаляется, чтобы убедиться, что счет правильный.

Имейте в виду, что вы также можете просто сделать это в методе Vote save вместо получения сигналов.

Вы можете также сделать это как задание или задание в зависимости от ваших обстоятельств

...