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(..)
本身将产生一个等价的查询,因此它们是相同的),但是获取学生当然会产生一个额外的查询。