Джанго уникально вместе увлекаются отношениями - PullRequest
0 голосов
/ 28 октября 2018

Я пишу REST API с использованием Django и Django Rest Framework.В настоящее время я пишу модели.

У меня есть модель для студентов, модель для вопросов и модель для ответов.

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

Как я могу добиться, чтобы студенты могли выбрать только один вопрос за ответ?Или выбор модели с отношениями - плохой дизайн?

1 Ответ

0 голосов
/ 29 октября 2018

Поскольку вы упомянули, что ученики должны выбирать ответы на вопросы, я думаю, что вам нужно иметь модель для ваших вариантов / вариантов вопросов.Затем вы можете смоделировать модель ответа учащегося на основе уникальности (ученик, вопрос)

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.

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