【问题标题】:Get Foreign Objects instead of QuerySet of List of ID's获取外部对象而不是 ID 列表的 QuerySet
【发布时间】:2020-11-28 17:31:43
【问题描述】:

单行代码即可获取外键对象,而不是 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)

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

现在我想根据应从 Member 模型中过滤掉的 college_id 获取属于特定学院的所有学生

我现在过得怎么样

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

现在students 是学生 UUID 列表的查询集

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

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

我觉得这是一种不恰当的方式。任何人都可以建议一行代码来获取外键对象而不是 UUID 的 QuerySet。提前致谢

【问题讨论】:

    标签: python-3.x django database postgresql django-orm


    【解决方案1】:

    你可以过滤:

    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,
            related_name='members',
            on_delete=models.CASCADE
        )
        college = models.ForeignKey(
            College,
            related_name='members',
            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.ManyToManyField(
            'College',
            related_name='students'
            through='Member'
        )

    然后你可以过滤:

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

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 2017-10-03
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2015-01-27
      相关资源
      最近更新 更多