Обновите поле других моделей при добавлении новой записи - PullRequest
0 голосов
/ 11 ноября 2019

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

Модель вопроса

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 при каждом добавлении нового ответа?

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Вместо поля типа 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")
    ...
0 голосов
/ 11 ноября 2019

проблема в том, что, когда вы пытаетесь найти вопросы, данные отсутствуют, поскольку сначала необходимо создать запись вопроса в db, а затем присоединить поля отношения m2m. Я думаю, решение состоит в том, чтобы использовать сигналы - в частности, m2m_changed , где действие будет post_add.

С другой стороны, если вы хотите избавиться от поля Question.hasAnswer,Для модели вопроса вы можете использовать cached_property , чтобы проверить, есть ли на вопрос ответы, например:

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