Приложение с вопросами, в котором пользователь должен дать монеты, чтобы задать вопрос, а ответивший получит монеты
enter code here Я создаю веб-приложение типа "вопрос-ответ". Я хочу, чтобы пользователь, задающий вопрос, в обязательном порядке давал монеты. Варианты ответов уже есть. Затем пользователь, который отвечает на вопрос, получает монеты, отданные другим пользователем. Я использую сигналы Django, но пользователь, который задает вопрос, получил свои монеты, но отвечающий не получил ни одной монеты, он выдает мне ошибку. Это модель для вопросов и ответов. У меня уже есть модель пользователя с монетой по умолчанию 5000

class Question(models.Model):
COINS_CHOICES = (
(10, 10),
(20, 20),
(30, 30),
(40, 40),
(50, 50),
(60, 60),
(70, 70),
(80, 80),
(90, 90),
(100, 100),
)
label = models.CharField(max_length=5000)
image = models.ImageField()
#slug = models.SlugField()
timestamp = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now_add=True)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
coins_given = models.PositiveSmallIntegerField(choices=COINS_CHOICES, blank=False, null=True)
def __str__(self):
return self.label
class Answer(models.Model):
label = models.CharField(max_length=5000)
image = models.ImageField()
timestamp = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
clap = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="answers")
def __str__(self):
return self.label
def number_of_clap(self):
return self.clap.count()
class Comment(models.Model):
text = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
@receiver(post_save, sender=Question)
def subtract_coins_from_user(sender, instance, created, **kwargs):
if created:
profile = instance.user
profile.coin -= instance.coins_given
profile.save()
@receiver(post_save, sender=Answer)
def add_coins_to_user(sender, instance, created, **kwargs):
if created:
profile = instance.user
profile.coin += instance.coins_given
profile.save()
Модель Answer не имеет поля coins_given, связанный вопрос имеет, поэтому вы получаете coins_given из .question из instance с:
@receiver(post_save, sender=Answer)
def add_coins_to_user(sender, instance, created, **kwargs):
if created:
profile = instance.user
profile.coin += instance.question.coins_given
profile.save()
При этом я не уверен, что использование сигналов - хорошая идея: сигналы можно обойти, они могут иметь нежелательные побочные эффекты и сделать менее предсказуемым то, что сделает .save().