filter 条件关于外键 的疑问
来源:11-9 学过该课程的同学还学习过的课程
dalindatao
2020-01-06
按照老师的讲述 我的理解是
course_id 是通过 url传递过来的参数
course.id 是object 一个对象后 获取的课程id
因此可以理解以下几条语句的filter 条件相同
all_students = UserCourse.objects.filter(course=course_id)
all_students = UserCourse.objects.filter(course_id=course_id)
all_students = UserCourse.objects.filter(course=course.id)
all_students = UserCourse.objects.filter(course_id=course.id)
不能理解
all_students = UserCourse.objects.filter(course=course)
的filter course=course 的条件为什么成立
course = Course.objects.get(id=course_id)
获取的是一个queryse对象
print(type(course))
结果为
<class ‘apps.courses.models.Course’>
则
学习过该课程的学生
all_students = UserCourse.objects.filter(course=course)
的filter 条件 course 为什么能等于一个对象
1回答
-
bobby
2020-01-08
你这里有几个错误
all_students = UserCourse.objects.filter(course=course_id) all_students = UserCourse.objects.filter(course_id=course_id)
这两个语句看起来是一回事,但是第一个语句会报错的,因为course
是一个course对象,不能传递一个id进去,所以应该是all_students = UserCourse.objects.filter(course=course) all_students = UserCourse.objects.filter(course_id=course_id)
这两个语句是一样的,内部转换也会转换为下面的模式
第二个问题
course = Course.objects.get(id=course_id)这里要重点注意一下get方法和filter方法有一个很大的区别,就是get方法会立即查询数据库并返回成一个对象,filter方法返回的是queryset对象,注意一下queyset对象并不会查询数据只有你真正的进行for循环queryset的时候才会去查询数据库,所以你没有进行for循环之前是无法实例化成model对象的,这个queryset你可以理解为一个sql语句组装器,是用来生成sql的不是用来查询数据库的
所以UserCourse.objects.filter(course=course)这个传递course对象是没有问题的,但是你要知道这个对象本质依然是去通过id字段查询,总结一下:
get方法和filter方法有很大的区别,get方法是立即查询数据库而且返回的是model对象, 还有就是这个方法很严格,没有数据和数据重复都会报错,filter方法返回的是queryset对象,这个方法查询不到数据和查询到多条数据都不会报错,最重要的是这个方法并没有真正的查询数据直到你去对这个queryset对象进行for循环
222020-01-21
相似问题