Py学习  »  Django

Django唯一性和关系约束

J. Hesters • 4 年前 • 221 次点击  

我正在使用django和django-rest框架编写一个RESTAPI。我现在正在写模型。

我有一个学生模型,一个问题模型和一个答案模型。

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)

我发现有一个 unique_together 的约束 class Meta . 但在我看来,它不能具体说明关系。我需要这样的东西;

class Meta:
   unique_together = ('student', 'answer__question')

我怎样才能做到学生每个答案只能选一个问题?或者挑选一个有关系的模型是一个糟糕的设计?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38427
 
221 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Angela
Reply   •   1 楼
Angela    5 年前

因为你提到学生需要选择问题的答案,我认为你需要一个问题选项/选择的模型。然后,您可以在(学生,问题)上用Uniquetogether建模您的学生响应模型。

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")

如果每个问题都需要有独特的选择,那么这是另一种方法。这和 polls app tutorial 在Django文档中。

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")