【发布时间】:2014-07-03 05:50:09
【问题描述】:
我有一个调查应用程序,我需要根据用户以前的答案来限制可用的答案选择。
为了实现这一点,我认为引入依赖表是个好主意。
我觉得我快到了,但我无法弄清楚如何为我想要的结果构建正确的查询,或者我是否以最简单的方式解决问题。
我的桌子是:
- 用户
- 问题
- 选择
- 回答
- 依赖关系
- Choice_Dependencies(多对多通过选择和依赖)
依赖项引用一个问题和一个选择。每个依赖项都有一个描述字段,例如“是男性”,因此如果问题 1 是“你是男性还是女性?”问题 1 有 2 个选项,“男”choice_id=1,“女”choice_id=2。然后该依赖记录将引用问题 1 和选项 1。
然后,您可以将该依赖关系与许多选择相关联。
因此,如果问题 2 是“您最喜欢这些东西中的哪一个?”可用的选择记录是化妆、裙子、汽车、油脂,
汽车和油脂与“是男性”相关,而化妆和裙子则与“女性”相关
我需要弄清楚如何编写一个查询来获取满足每个依赖项的所有选择。
我认为的另一种方法是获取任何不满足的选择并将其排除在可用选择之外。也许是 NOT IN 子查询?
问题也与他们的选择有关。但我可以处理这部分查询。
这是一个 django 应用程序,但我不在乎是否必须使用原始 sql。下面是我在 SQL 和 django 模型语法中解释的表结构。
SQL
CREATE TABLE public.auth_user (
id serial NOT NULL,
password varchar(128) NOT NULL,
last_login timestamp with time zone NOT NULL,
is_superuser boolean NOT NULL,
username varchar(30) NOT NULL,
first_name varchar(30) NOT NULL,
last_name varchar(30) NOT NULL,
email varchar(75) NOT NULL,
is_staff boolean NOT NULL,
is_active boolean NOT NULL,
date_joined timestamp with time zone NOT NULL
)
CREATE TABLE public.bny_question (
id serial NOT NULL,
section_id integer NOT NULL,
input_type_id integer NOT NULL,
"order" integer NOT NULL,
text text NOT NULL
)
CREATE TABLE public.bny_dependency (
id serial NOT NULL,
question_id integer,
choice_id integer,
description varchar(255) NOT NULL
)
CREATE TABLE public.bny_choice_dependencies (
id serial NOT NULL,
choice_id integer NOT NULL,
dependency_id integer NOT NULL
)
CREATE TABLE public.bny_choice (
id serial NOT NULL,
question_id integer NOT NULL,
text varchar(255) NOT NULL,
value varchar(255) NOT NULL,
blurb text NOT NULL,
"order" integer NOT NULL
)
CREATE TABLE public.bny_answer (
id serial NOT NULL,
user_id integer NOT NULL,
question_id integer NOT NULL,
choice_id integer NOT NULL
)
姜戈
class Question(models.Model):
section = models.ForeignKey('Section')
input_type = models.ForeignKey('Input_type')
order = models.IntegerField()
text = models.TextField()
class Meta:
ordering = ['order']
def get_next(self):
next = Question.objects.filter(id__gt=self.id)
if next:
return next[0]
return None
def __unicode__(self):
return u"%s" % (self.text)
class Dependency(models.Model):
question = models.ForeignKey('Question', null=True)
choice = models.ForeignKey('Choice', null=True)
description = models.CharField(max_length=255, blank=True)
class Meta:
verbose_name_plural = "dependencies"
def __unicode__(self):
return u"%s [%s - %s]" % (self.description, self.question, self.choice)
class Choice(models.Model):
question = models.ForeignKey('Question', related_name='choices')
dependencies = models.ManyToManyField('Dependency', related_name='dependent_choices', null=True)
text = models.CharField(max_length=255)
value = models.CharField(max_length=255)
blurb = models.TextField()
order = models.IntegerField()
class Meta:
ordering = ['order']
def __unicode__(self):
return u"%s" % (self.value)
class Answer(models.Model):
user = models.ForeignKey(User, related_name='answers')
question = models.ForeignKey('Question')
choice = models.ForeignKey('Choice')
class Meta:
unique_together = ('user', 'question',)
def __unicode__(self):
return u"%s - %s" % (self.question, self.choice)
【问题讨论】:
标签: sql database django survey