Экземпляр «Ответ» должен иметь значение первичного ключа, прежде чем можно будет использовать отношение многие ко многим - PullRequest
2 голосов
/ 08 мая 2009

У меня есть модель с именем Answer, которая имеет отношение ForeignKey к другой модели с именем Question. Это означает, что на вопрос может быть несколько ответов, естественно.

class Question(models.Model):
    kind = models.CharField(max_length=1, choices=_SURVEY_QUESTION_KINDS)
    text = models.CharField(max_length=256)

class Answer(models.Model):
    user = models.ForeignKey(User, related_name='answerers')
    question = models.ForeignKey(Question)
    choices = models.ManyToManyField(Choice, null=True, blank=True) # <-- !
    text = models.CharField(max_length=_SURVEY_CHARFIELD_SIZE, blank=True)

Теперь я пытаюсь создать экземпляр Answer, а затем установить отношение M2M на Choice, но я получаю следующую ошибку, прежде чем даже коснуться M2M: 'Answer' instance needs to have a primary key value before a many-to-many relationship can be used.

 ans = Answer(user=self._request.user,
              question=self._question[k],
              text=v)
 ans.save() # [1]

Когда я комментирую [1] проблема, конечно, исчезает, но я не понимаю, почему она возникает в первую очередь, потому что, как вы можете видеть, я ничего не делаю с 1012 в M2M в все!


РЕДАКТИРОВАТЬ: Кажется, это не проблема с именем choices. Я пытался изменить его каждый раз на options с той же проблемой.

1 Ответ

2 голосов
/ 08 мая 2009

Спасибо всем, кто нашел время на этот вопрос. Классы, представленные в моем вопросе, не были завершены, потому что я думал, что внутренние Meta классы не имеют значения. На самом деле Answer выглядело так:

class Answer(models.Model):
    """
    We have two fields here to represent answers to different kinds of
    questions.  Since the text answers don't have any foreign key to anything
    relating to the question that was answered, we must have a FK to the
    question.
    """

    class Meta:
        order_with_respect_to = 'options'

    def __unicode__(self):
        return '%s on "%s"' % (self.user, self.question)

    user     = models.ForeignKey(User, related_name='answers')
    question = models.ForeignKey(Question)
    options  = models.ManyToManyField(Option, blank=True)
    text     = models.CharField(max_length=_SURVEY_CHARFIELD_SIZE, blank=True)
    answered = models.DateTimeField(auto_now_add=True)

Посмотрите на order_with_respect_to, и вы поймете, откуда возникла ошибка. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...