Как сделать primay или уникальные три поля в моделях django?

В моем Django models.py есть четыре модели (Пользователь, Экзамен, Вопросы, Ответы). модель Answer имеет четыре поля ( user, exam, question, answer ) после создания экзамена и создания вопросов для него, пользователи приходят на экзамен. Я хочу хранить ответы пользователей в модели Answer, поэтому я указываю, какой пользователь сдает экзамен и отвечает на какой вопрос, в конце я сохраняю ответы пользователей в последнем поле (поле 'answer' в модели Answer)

но я хочу, чтобы этот пользователь только один раз мог ответить на этот вопрос на этом экзамене, поэтому я хочу сделать эти поля (пользователь, экзамен, вопрос) первичными в модели ответа, что

моя модель ответа:

class Answer(models.Model):
    exam      = models.ForeignKey(Exam, on_delete=models.CASCADE, default=None)
    user      = models.ForeignKey(User, on_delete=models.CASCADE)
    question  = models.ForeignKey(Question, on_delete=models.CASCADE)
    answer    = models.CharField(max_length=8)

Я не знаю, как сделать это действие для трех первичных полей на самом деле, не имеет значения, похожи ли два или одно поле из этих трех полей, я просто хочу предотвратить сохранение записей, которые уже сохранены в полях пользователь, экзамен и вопрос

Например, в моей базе данных есть такая запись: пользователь:1, экзамен:52, вопрос:38, ответ: "вариант_а"

когда я хочу сохранить следующую запись, я ожидаю получить ошибку: пользователь:1, экзамен:52, вопрос:38, ответ: "option_b"

>

но эта запись в порядке: пользователь:1, экзамен:52, вопрос:60, ответ: "вариант_c"

>

Django хочет, чтобы только одно поле было первичным ключом. Решение в вашем случае - использовать unique_together для ваших трех полей:

class Answer(models.Model):
    exam      = models.ForeignKey(Exam, on_delete=models.CASCADE, default=None)
    user      = models.ForeignKey(User, on_delete=models.CASCADE)
    question  = models.ForeignKey(Question, on_delete=models.CASCADE)
    answer    = models.CharField(max_length=8)

    class Meta:
        unique_together = ['user', 'exam', 'question']

Документация об опции unique_together: https://docs.djangoproject.com/fr/4.1/ref/models/options/#unique-together

Вернуться на верх