获取外部对象而不是 ID 列表的 QuerySet

Get Foreign Objects instead of QuerySet of List of ID's

单行代码获取外键对象而不是 UUID 的 QuerySet。

我有三个模型,

Student, College, Member

模型定义如下

class Student(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name=models.CharField(max_length=128)

class College(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name=models.CharField(max_length=128)

class Member(models.Model):
    student= models.ForeignKey(Student, related_name="students", on_delete=models.CASCADE)
    college= models.ForeignKey(College, related_name="colleges", on_delete=models.CASCADE)

其中成员包含 Student 和 College 作为外键字段

现在我想根据college_id获取属于特定学院的所有学生,这应该从成员模型

中过滤掉

我现在过得怎么样

student_ids = Member.objects.filter(college_id=college_id).values("student")

现在 students 是 Student

的 UUID 列表的查询集

因为我需要实际的 Student 对象而不是 UUID 的 QuerySet 列表

students = Student.objects.filter(id__in=[str(uid) for uid in student_ids])

我觉得这种做法不妥。任何人都可以建议单行代码来获取外键对象而不是 UUID 的 QuerySet。提前致谢

您可以过滤:

Student.objects.filter(<b>students__college_id=<i>college_id</i></b>)

然而 related_name=… parameter [Django-doc]reverse 中关系的名称。因此将它们重命名更有意义,例如:

class Member(models.Model):
    student = models.ForeignKey(
        Student,
        <b>related_name='members'</b>,
        on_delete=models.CASCADE
    )
    college = models.ForeignKey(
        College,
        <b>related_name='members'</b>,
        on_delete=models.CASCADE
    )

然后你过滤:

Student.objects.filter(<b>members__college_id=<i>college_id</i></b>)

您还可以在 CollegeStudent 之间跨越 概念 ManyToManyField [Django-doc]:

class Student(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=128)
    colleges = models.<b>ManyToManyField(</b>
        'College',
        related_name='students'
        through='Member'
    <b>)</b>

然后你可以过滤:

Student.objects.filter(<b>colleges=<i>college_id</i></b>)