Postgresql 许多关系中的查询集

Postgresql 许多关系中的查询集,postgresql,django-queryset,Postgresql,Django Queryset,在这个项目中,我们在教室里为学生分配一个徽章 class Badge(models.Model): klass = models.ForeignKey( # klass means classroom 'klass.Class', on_delete=models.CASCADE, related_name='badges', db_index=True, ) users = models.ManyToMan

在这个项目中,我们在教室里为学生分配一个徽章

class Badge(models.Model):
    klass = models.ForeignKey( # klass means classroom
        'klass.Class',
        on_delete=models.CASCADE,
        related_name='badges',
        db_index=True,
    )
    users = models.ManyToManyField( # the students in 'klass' that have this badge
        User,
        through='UserBadge',
        through_fields=('badge', 'user'),
    )
用户的自定义中间表
多个字段:

class UserBadge(models.Model):
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='taken_badges',
    )
    badge = models.ForeignKey(
        Badge,
        on_delete=models.CASCADE,
        related_name='assigned_badges',
    )
        klass = models.ForeignKey( # this classroom is badge.klass
        'klass.Class',
        on_delete=models.CASCADE,
        related_name='assigned_badges',
    )
我需要找到与特定
用户
klass
相关的所有徽章。所以我可以在特定的教室里检索特定学生的所有徽章

class Badge(models.Model):
    klass = models.ForeignKey( # klass means classroom
        'klass.Class',
        on_delete=models.CASCADE,
        related_name='badges',
        db_index=True,
    )
    users = models.ManyToManyField( # the students in 'klass' that have this badge
        User,
        through='UserBadge',
        through_fields=('badge', 'user'),
    )
我试过:

Bagde.objects.filter(userbadge__user__id = student_id,userbadge__klass__id=klass_id)
错误是:
无法将关键字“userbadge”解析为字段。

谢谢。

由于您已将
相关的\u名称设置为
“分配的\u徽章”
,因此您应按照以下方式实施过滤器:

Bagde.objects.filter(
    assigned_badges__user__id=student_id,
    assigned_badges__klass__id=klass_id
)
Bagde.objects.filter(
分配的\徽章\用户\ id=学生\ id,
分配的\u徽章\uuuu klass\uuuuu id=klass\u id

)
谢谢师父。我也找到了另一种方法
student.badge\u set.filter(klass=klass)
如果可能的话,让我们知道这种方法中的哪一种更快?第一种,假设你以前没有取
student
。由于使用
student.badge\u set.filter(..)
首先需要通过查询获取
student
对象。查询本身(因此
student.badge\u set.filter(..)
本身将产生一个等价的查询,因此它们是相同的),但是获取学生当然会产生一个额外的查询。