如何在列表视图中过滤模型



我有一个页面,其中显示了面试官列表和每个用户的一些重要信息。我想要展示的一件事是被那个特定的面试官面试过的用户的数量。我写了这样一个视图:

class ManagerUsers(ListView):
model = User
template_name = 'reg/manager-users.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['scientific_interviewers'] = User.objects.filter(role='theory_interviewer').all()
context['interviewed_number'] = len(ScientificInfo.objects.filter(user__role='applicant', is_approved=True, interviewer=?????))

面试官字段应该等于该对象的用户,但我不知道具体该怎么做。输出应该是这样的:对象1:用户的姓名,用户的其他信息,用户的面试号码…

这些是我的模型:

USER_ROLE_CHOICES = (('0', 'applicant'),
('1', 'theory_interviewer'),)
class User(AbstractUser):
id = models.AutoField(primary_key=True)
role = models.CharField(max_length=25, null=True, choices=USER_ROLE_CHOICES, default=USER_ROLE_CHOICES[0][0])
username = models.CharField(unique=True, max_length=13)
first_name = models.CharField(max_length=32, null=True, default=None)
last_name = models.CharField(max_length=64, null=True, default=None)
class ScientificInfo(models.Model):
id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user')
interviewer = models.OneToOneField(User, on_delete=models.CASCADE, related_name='interviewer')
is_approved = boolean field

您可以覆盖.get_queryset()方法[Django-doc]只返回访问程序。通过.annotate(…)[Django-doc]你可以给这些User添加一个额外的属性:

from django.db.models import Count
class ManagerUsersView(ListView):
model = User
context_object_name = 'scientific_interviewers'
template_name = 'reg/manager-users.html'

def get_queryset(self):
return super().get_querset().filter(
role='1'
).annotate(
interviewed_number=Count('interviewer', filter=Q(interviewer__user__role='0', interviewer__is_approved=True))
)

从这个查询集产生的Users将有一个额外的属性.interviewed_number,其中包含批准的ScientificInfo的数量,该用户是interviewer


注意在Django中,基于类的视图(CBV)通常有一个…View后缀,以避免与模型名冲突。因此,可以考虑将视图类重命名为ManagerUsersView,而不是ManagerUsers


注意related_name=…参数[Django-doc]反向中关系的名称,所以从User模型到ScientificInfo模型。因此,将其命名为……(通常)没有多大意义和前向关系一样。因此,您可能需要考虑将interviewer关系重命名为interviews