django-models - 使用 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”时是否会引发问题
对不起,我的英语很差,我已尽力描述问题,期待您的回答,非常感谢!
解决方案
使用
__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])
推荐阅读
- mysql - 编写此查询的正确方法是什么?
- php - SimpleSAMLPHP:成功登录后,getAttribute 不会从 IdP 重新调整任何内容
- python - 使用 HMM 模型对具有 5 天“回溯”的每日收益时间序列状态进行分类
- jmeter - 从先前的响应中提取值并在 jmeter 的后续请求中以相应数量的块发送数据
- javascript - 下拉菜单应该关闭了,除了主页面,怎么办?
- python - 如何将数据框转换为样本?
- c# - 在 ASP.NET Core Web API 中使用系统和使用 Microsoft 导入的所有问题
- javascript - 根据包含单元格的引号字符转换数组单元格
- javascript - Javascript将数组转换为具有备用索引作为键和值的对象
- javascript - 主程序中的等待是否使 js 调用堆栈为空,从而为回调提供了运行的机会?