Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型设计_Python_Sql_Django - Fatal编程技术网

Python Django模型设计

Python Django模型设计,python,sql,django,Python,Sql,Django,我正在Django上开发一个测验应用程序,有以下模型-用户、测试、问答。测试模型充当问题模型的包装器。这就是我的模型目前的样子- models.py class Test(models.Model): def id_count(): current_count = Test.objects.count() current_count += 1 return current_count test_id = models.Positiv

我正在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' )
    ...
只要在元组中输入正确的字段名,数据库就会强制执行唯一性

更多信息:

在回答表中提出客户和问题的复合索引

比如:

class Answer(...
    class Meta:
        unique_together = ( 'customuser', 'question' )
    ...
只要在元组中输入正确的字段名,数据库就会强制执行唯一性

更多信息:

请尝试以下代码回答型号

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组合在一起,您需要在模型的元类中添加unique\u

请尝试以下代码回答模型

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组合在一起,您需要在模型的元类中添加unique\u

您好,感谢您的快速响应。这在管理层对我来说是可行的,但是,提交时我的FormView仍然接受对用户和问题来说不是唯一的答案。编辑了我的问题以包括特定的CBV。谢谢。嗨,谢谢你的快速回复。这在管理层对我来说是可行的,但是,提交时我的FormView仍然接受对用户和问题来说不是唯一的答案。编辑了我的问题以包括特定的CBV。谢谢