添加新记录时更新其他模型字段

Update other models field when new record adds

我正在做问答网站。 因为我想在为该问题添加新答案时将问题标记为已回答。

问题模型

class Question(models.Model):

    question = models.CharField(max_length=400)
    uid = models.ForeignKey("User",on_delete=models.SET_DEFAULT,default=1,related_name='user_q_id_set')
    vote = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    catitle = models.ForeignKey("Category", on_delete=models.CASCADE)
    editUser = models.ManyToManyField("User",related_name='user_q_edit_set',null=True,blank=True)
    hasAnswer = models.BooleanField(default=False)

答案模型

class Answer(models.Model):
    answer = models.TextField()
    qid = models.ManyToManyField("Question")
    uid = models.ForeignKey("User",on_delete=models.CASCADE,related_name='user_a_id_set')
    vote = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    editUser = models.ManyToManyField("User",related_name='user_a_edit_set',null=True,blank=True)

    class Meta:
        ordering = ['-vote']

    def save(self,*args, **kwargs):
        self.qid.hasAnswer=True

这是我尝试过但出错的方法

ValueError at /admin/qa/answer/add/
"<Answer: None>" needs to have a value for field "id" before this many-to-many relationship can be used.

那么,每当有新答案添加时,我如何将 hasAnswer 更改为 True?

与其使用 Question.hasAnswer 这样的字段,不如使用 属性 来表示该关系:

class Question(models.Model):
    ...
    @property
    def has_answer(self):
        return self.answers.exists()


class Answer(models.Model):
    ...
    questions = models.ManyToManyField("Question", related_name="answers")
    ...

问题是,当您尝试访问问题时没有数据,因为首先应该在数据库中创建问题条目,然后应该附加 m2m 关系字段。我认为,解决方案是使用信号 - 特别是 m2m_changed,其中操作是 post_add.

另一方面,如果您想摆脱 Question.hasAnswer 字段。对于问题模型,您可以使用 cached_property 来检查问题是否有答案,例如:

class Question(models.Model):
    ...
    @cached_property
    def has_answer(self):
        return self.answer_set.exists()