我正在使用Django和Django Rest Framework编写REST API。我目前正在编写模型。
我有一个学生模型,一个问题模型和一个答案模型。
class Question(models.Model):
question_text = models.CharField()
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer_text = models.CharField()
class Student(models.Model):
name = models.CharField()
每个问题,学生应该只能选择一个答案。 所以我当时正在考虑设计一个学生选择的答案模型-这样我就可以让学生选择一个关系-像这样:
class StudentPickedAnswer(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
我发现class Meta
有一个unique_together
约束。但是在我看来,它无法指定关系。我需要这样的东西;
class Meta:
unique_together = ('student', 'answer__question')
如何使学生每个答案只能选择一个问题?还是通过具有关系的模型进行挑选是不好的设计?
答案 0 :(得分:1)
因为您提到学生需要选择问题的答案,所以我认为您需要为您的问题选项/选择提供模型。然后,您可以在(学生,问题)上使用唯一的模型来建模学生的响应模型。
class Question(models.Model):
question_text = models.CharField()
options = models.ManyToManyField(QuestionOption)
class QuestionOption(models.Model):
option_text = models.CharField(max_length=255)
class Student(models.Model):
name = models.CharField()
class StudentResponse(models.Model):
student = models.ForeignKey(Student)
question = models.ForeignKey(Question)
response_option = models.ForeignKey(QuestionOption)
class Meta:
unique_together = ("student", "question")
如果每个问题都需要有独特的选择,则是另一种方法。这类似于Django文档中的polls app tutorial。
class Question(models.Model):
question = models.CharField(...)
class QuestionOption(models.Model):
question = models.ForeignKey("Question",related_name="qs_options")
option = models.CharField(max_length=200)
class Meta:
# ensuring choices are not duplicated for a question.
unique_together = ("question", "option")