python - 检查对象是否与 ManyToMany 字段和聚合字段中的其他对象有关系
问题描述
我有几个模型如下:
class Student(models.Model):
name = models.CharField()
classes = models.ManyToManyField(Class, related_name="students")
class Class(models.Model):
nombre = models.CharField
我需要的是这样一种方法,当查询某个班级的学生时,它不仅返回该班级的学生,而是返回所有学生的 QuerySet,每个学生都有一个聚合字段,指示该学生是否就读于该班级类,例如:
[{'name':'student A', 'enrolled_in_physics':True}, {'name':'student B', 'enrolled_in_physics':False}]
我认为可以通过F() expressions
with来实现ExpressionWrapper
,但不知道如何实现它们;另外,文档和示例对新手不太友好。任何帮助表示赞赏,谢谢!
编辑:好的,我认为使用“列表”这个词是不正确的,我需要一个普通的QuerySet,这样让我做这样的事情:
student_a = query[0]
student_a.name
>>>'A'
student_a.enrolled_in_physics
>>>True
解决方案
更新 您可以尝试在学生类中定义一个方法:
class Student(models.Model):
name = models.CharField()
classes = models.ManyToManyField(Class, related_name="students")
def enrolled_in_class(self,class_name):
if len(Class.objects.filter(nombre=class_name,students__in=self)) > 0:
return True
else:
return False
students = Student.objects.all()
student_a = students[0]
student_a.name
student_a.enrolled_in_class('physics')
原答案:
编辑:对不起,误读了问题,我将尝试为您真正想要的答案一起获得答案:所有学生的列表,如果他们被特定班级录取,则二进制为真假。
好的,我将其阅读为:我需要一个返回字典列表的查询,指示学生和班级注册情况。
#Assume: class_name = 'physics'
def get_class_list(class_name):
filtered_class = Class.object.get(nombre=class_name)
student_names = Students.objects.filter(classes__contains=filtered_class).values_list('name',flat=True)
class_list = []
for name in student_names:
class_list = {}
class_list['name'] = name
enrolled_class_string = 'enrolled_in_' + class_name
class_list[enrolled_class_string] = True
return class_list
这将为您提供一个字典列表,其中包含名为“name”和“class__name”的键
推荐阅读
- c - 在石头,纸,剪刀中打破循环 - C
- outlook - Outlook REST API 2.0 路线图/生命周期
- python - Flask SQLAlchemy 'str' 对象没有属性 '_sa_instance_state'
- python - Django:在 settings.py 中使用日志记录
- java - SurfaceControl minLayer 和 maxLayer
- node.js - 如何将默认时间设置为当前时间 mongo 模式?
- jquery - Jquery Datepicker插件值属性不起作用
- javascript - Chrome 不会加载我的 js 脚本文件
- materialize - 在浮动按钮中实现 CSS 图标定位
- ios - 使用 Swift 4,如何获取本地存储的图像?