Приложение с вопросами, в котором пользователь должен дать монеты, чтобы задать вопрос, а ответивший получит монеты

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

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().

Вернуться на верх