Как сделать 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