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循环

2
2
bobby
回复
dalindatao
是的, filter(course=course) 这样其实这样做的背后也是转换成course_id=course_id, 至于为什么(course=course) 主要是因为course是一个对象属性,所以你赋值的时候吧应该传递一个int类型过去,这样也是为了严格,你不能说这个course对象明明是一个course类,但是你却传递了一个int过来,你让另一些使用的人怎么想?会不会让他们觉得你这样设置很随意,本身python的动态性就已经被很多人诟病了,所以这里再来随意点很容易被人吐槽,你只要自己心里清楚这里的本质就是course_id就行了
2020-01-21
共2条回复

Django+ xadmin 开发在线教育网站

一套通用的技术组合拳,助你解决大部分Python类网站后端问题

1911 学习 · 2149 问题

查看课程