Q' Q'在幕后发生了什么?复杂数据库?

时间:2018-01-22 01:59:06

标签: django database

我正在尝试编写尽可能高效的查询。这是我的问题: 假设我有10个教师对象,每个教师有100个测试对象(测试通过OneToOne关系与教师相关)。我有每个测试的独特slug,所以我可以这样查看:

CreateTest.objects.filter(slug__iexact= slug_name)

但是,这种方式似乎非常低效,因为Django将寻找已经创建的每个测试,并且其中有1000个,因为有10个教师。相反,我试图做这样的事情:

teacher=TeacherUser.objects.filter(user__username__iexact=self.request.user) teacher_test = teacher.createtest_set.filter(slug__iexact=slug_name)

现在,它正在从特定用户获得所有测试,然后它正在搜索所需的测试。 我想用' Q'来写同样的东西。我想写这个:

CreateTest.objects.filter(teacher__user__username=self.request.user, slug__iexact=self.kwargs['slug'])

但是,出于某种原因,我认为这不是我想要的。它正在检查老师是否相同,并且slug是相同的。我希望它首先获得特定教师的所有测试。之后我想从该列表中查询测试。如果我做我想要的任何想法?

1 个答案:

答案 0 :(得分:0)

我认为您需要根据您的描述将教师和测试之间的关系设置为OneToMany而不是OneToOne:

class CreateTest(models.Model):
    teacher = models.ForeignKey(TeacherUser)

如果你已经这样做了,那么你已经尝试了几个可行的选项,即直接从slug或pk获得测试,如果你的表被slug和pk索引,这应该是有效的。

您似乎感到困惑的一个问题是,当您应该使用.filter时,您正在使用.get来返回实例。

.filter返回另一个QuerySet,而不是实例。

您的上次尝试应如下所示:

CreateTest.objects.filter(
    teacher__user=self.request.user,
    slug__iexact=self.kwargs['slug']
)

您正在尝试将用户名与无效的用户对象进行比较

希望你明白