猿问

Django使用外键进行多次查询

假设我有两个不同的应用程序:


teacher/models.py:


  Teacher(models.Model):

     name = models.CharField(max_length=300)



class/models.py:


  Class(models.Model):

     name = models.CharField(max_length=300)

     teacher = models.ForeignKey(Teacher)

     students = models.ManyToManyField(Student)

我想让所有的老师上课和所有的课程都附上。


我想要的结果:


{[

   teacher: '3L' #Teachers Id

   classes: ['20L','14L','30L'] #list of Class objects or ids with the above teacher

],

[# similar to above]


}

这是可能的吗?这就是我目前正在做的事情:


classes = Class.objects.all()

teachers = Teacher.objects.filter(id__in=classes.value_list('teacher',flat=True).distinct())

for teacher in teachers:

    classes_for_teachers = classes.objects.filter(teacher=teacher)

在上面的代码中,有四个使用循环进行的查询,这无疑增加了时间复杂度。有没有更好的解决方案?提前致谢。


繁华开满天机
浏览 192回答 1
1回答

猛跑小猪

使用prefetch_related:teachers = Teacher.objects.prefetch_related('class_set')# what you want is not a valid Python structure (set of lists (looking like dicts))# list of dicts makes more senseresult = [    {'teacher': t.pk, 'classes': t.class_set.all()}    for t in teachers]无论有多少老师和班级,这只会触发 2 db 查询。
随时随地看视频慕课网APP

相关分类

Python
我要回答