社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Django唯一性和关系约束

J. Hesters • 5 年前 • 257 次点击  

我正在使用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
 
257 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Angela
Reply   •   1 楼
Angela    6 年前

因为你提到学生需要选择问题的答案,我认为你需要一个问题选项/选择的模型。然后,您可以在(学生,问题)上用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")