获取外部对象而不是 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>)
您还可以在 College
和 Student
之间跨越 概念 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>)
单行代码获取外键对象而不是 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
因为我需要实际的 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>)
您还可以在 College
和 Student
之间跨越 概念 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>)