[英]Django models design
我正在Django上開發測驗應用程序,並且具有以下模型-用戶,測試,問題和答案。 測試模型充當問題模型的包裝器。 這是我的模型目前的樣子-
models.py
class Test(models.Model):
def id_count():
current_count = Test.objects.count()
current_count += 1
return current_count
test_id = models.PositiveIntegerField(default=id_count,primary_key=True)
test_description = models.CharField(max_length=255)
class Question(models.Model):
def id_count():
current_count = Question.objects.count()
current_count += 1
return current_count
test = models.ForeignKey(Test,on_delete=models.CASCADE)
question_id =
models.PositiveIntegerField(default=id_count,primary_key=True)
question_text = models.CharField(max_length=255)
option_one = models.CharField(max_length=12,default="Always")
option_two = models.CharField(max_length=12,default="Never")
class Answer(models.Model):
question = models.ForeignKey(Question,on_delete=models.CASCADE)
customuser =
models.ForeignKey(CustomUser,on_delete=models.CASCADE,blank=True,
null=True)
original_answer_score =
models.IntegerField(default=-1)
當前的模型基本上允許每個用戶多次回答相同的問題。 如何設計模型,使每個用戶只能回答一個問題一次? 謝謝。
編輯以添加相應的視圖:
class AnswerFormView(SingleObjectMixin, generic.FormView):
template_name = 'tests/question_detail.html'
form_class = forms.AnswerForm
model = models.Answer
def get_success_url(self,*args,**kwargs):
return reverse('tests:question_detail', args=(self.kwargs['pk'],))
def form_valid(self, form):
answer = models.Answer.objects.create(
question=models.Question.objects.get(question_id=self.kwargs['pk']),
customuser=self.request.user,
original_answer_score=form.cleaned_data['original_answer_score']
)
return super(AnswerFormView, self).form_valid(form)
在“答案”表中讓客戶提出問題並提出復合索引。
就像是:
class Answer(...
class Meta:
unique_together = ( 'customuser', 'question' )
...
只要在該元組中輸入正確的字段名稱,數據庫就將強制執行唯一性。
更多信息: https : //docs.djangoproject.com/en/2.0/ref/models/options/#unique-together
嘗試使用以下代碼為您解答模型。
class Answer(models.Model):
question = models.ForeignKey(Question,on_delete=models.CASCADE)
customuser = models.ForeignKey(CustomUser,on_delete=models.CASCADE,blank=True, null=True)
original_answer_score = models.IntegerField(default=-1, editable=False)
class Meta:
unique_together = **('question', 'customuser')**
ordering = ('question')
要僅回答一個問題,您將需要在字段中添加editable = False ,以便一旦輸入就無法對其進行編輯。
要組合使用quetion和customuser,您將需要在Model的Meta類中添加unique_together 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.