首页 > 解决方案 > 使用 django 过滤器“__in”时有什么限制吗?

问题描述

使用“__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]

所以我尝试使用:

   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”时是否会引发问题

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

标签: django-modelsdjango-queryset

解决方案


使用__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])

推荐阅读