添加新记录时更新其他模型字段
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()
我正在做问答网站。 因为我想在为该问题添加新答案时将问题标记为已回答。
问题模型
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()