首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django模型设计

Django模型设计
EN

Stack Overflow用户
提问于 2018-02-06 11:53:43
回答 2查看 213关注 0票数 0

我工作在Django上的一个小测验应用程序,有以下模型-用户,测试,问题和答案。测试模型充当问题模型的包装器。我的模特们现在就是这样-

models.py

代码语言:javascript
复制
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)

目前的模型基本上允许每个用户多次回答相同的问题。如何设计我的模型,让每个用户只回答一个问题一次?谢谢。

编辑以添加相应的视图:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 12:06:51

在回答表中使客户和问题成为一个复合索引。

类似于:

代码语言:javascript
复制
class Answer(...
    class Meta:
        unique_together = ( 'customuser', 'question' )
    ...

只要将正确的字段名放入元组中,数据库就会强制执行惟一性。

更多信息:https://docs.djangoproject.com/en/2.0/ref/models/options/#unique-together

票数 1
EN

Stack Overflow用户

发布于 2018-02-07 05:48:42

请尝试为您的应答模型编写以下代码。

代码语言:javascript
复制
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结合起来,您需要在模型的Meta类中添加unique_together

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48642476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档