我正在尝试编写尽可能高效的查询。这是我的问题: 假设我有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是相同的。我希望它首先获得特定教师的所有测试。之后我想从该列表中查询测试。如果我做我想要的任何想法?
答案 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']
)
您正在尝试将用户名与无效的用户对象进行比较
希望你明白