使用Django filtter“ __in”有没有限制?

时间:2019-08-20 09:46:40

标签: django-models django-queryset

使用“ __in”语法时会出现一些问题,它应该是100条记录,但最终返回值小于100

class Teacher(model.Model):
    name = model.CharField()
class Student(model.Model):
    teacher =  models.ForeignKey(Teacher,on_delete=models.CASCADE)

这是模型,但这不是我遇到的问题,这种情况比它复杂,我试图说明要点;

我尝试重现该问题,它看起来像:

我想让所有学生获得他们在[1,2,3,4]中的老师ID

所以我尝试使用:

   teachers =  Teacher.objects.filter(in__in=[1,2,3,4])
   students = Student.objcets.filter(teacher_id__in=teachers)

它遇到了一些问题,数据不完整,少于预期

我们知道,最好使用:

   teachers_list =  Teacher.objects.filter(in__in=[1,2,3,4]).values("id",flat=True)
   students = Student.objcets.filter(teacher_id__in=list(teacher_list))

当我使用第一句话时,它确实会引起问题;但我再也不能复发了,所以我想知道它是否会引起问题 使用“ __in = queryset”而不是“ in__in = list”时

对不起,我的英语很差,我已尽力描述了这个问题,请期待您的回答,非常感谢!

1 个答案:

答案 0 :(得分:0)

  

使用__in语法时会遇到一些问题,它应该是100条记录,但最终返回值小于100

您使用的是 id__in ,而不是teacher__in。尽管如此,进行这样的过滤不是一个好主意,您可以使用两个连续的下划线(__)来“浏览”一个关系,例如:

students = Student.objects.filter(teacher__id__in=[1,2,3,4])

或更简单:

students = Student.objects.filter(teacher_id__in=[1,2,3,4])