请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

filter 条件关于外键 的疑问

按照老师的讲述 我的理解是
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 为什么能等于一个对象

正在回答 回答被采纳积分+3

1回答

bobby 2020-01-08 12:09:55

你这里有几个错误 

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 回复 有任何疑惑可以回复我~
  • 提问者 dalindatao #1
    我明白老师的意思了
    我的疑问是
    
    course = Course.objects.get(id=course_id)
    这个语句是直接查询后返回了一个course对象
    而 comments = CourseComments.objects.filter(course = course) 
    这个queryset 如果按照sql语句拼接的话, filter 是一个sql语句的条件
    按照我的理解是应该为where 条件  数据库的字段 = 某个值 例如如 comment数据库的 course_id = id变量
    
    所以直接使用 .filter(course =通过url传递过来的 course_id)不就可是了吗
    但是.课程中是 用的 filter(course=course) 
    数据库字段course_id  = 一个对象?
    
    为什么where 条件 可以等于一个对象
    回复 有任何疑惑可以回复我~ 2020-01-19 22:24:27
  • bobby 回复 提问者 dalindatao #2
    是的, filter(course=course) 这样其实这样做的背后也是转换成course_id=course_id, 至于为什么(course=course) 主要是因为course是一个对象属性,所以你赋值的时候吧应该传递一个int类型过去,这样也是为了严格,你不能说这个course对象明明是一个course类,但是你却传递了一个int过来,你让另一些使用的人怎么想?会不会让他们觉得你这样设置很随意,本身python的动态性就已经被很多人诟病了,所以这里再来随意点很容易被人吐槽,你只要自己心里清楚这里的本质就是course_id就行了
    回复 有任何疑惑可以回复我~ 2020-01-21 18:53:30
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信