首页 > 解决方案 > 检查对象是否与 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() expressionswith来实现ExpressionWrapper,但不知道如何实现它们;另外,文档和示例对新手不太友好。任何帮助表示赞赏,谢谢!

编辑:好的,我认为使用“列表”这个词是不正确的,我需要一个普通的QuerySet,这样让我做这样的事情:

student_a = query[0]
student_a.name
>>>'A'
student_a.enrolled_in_physics
>>>True

标签: pythondjango

解决方案


更新 您可以尝试在学生类中定义一个方法:

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”的键


推荐阅读