我有一个页面,其中显示了面试官列表和每个用户的一些重要信息。我想要展示的一件事是被那个特定的面试官面试过的用户的数量。我写了这样一个视图:
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))
)
从这个查询集产生的User
s将有一个额外的属性.interviewed_number
,其中包含批准的ScientificInfo
的数量,该用户是interviewer
。
注意在Django中,基于类的视图(CBV)通常有一个
…View
后缀,以避免与模型名冲突。因此,可以考虑将视图类重命名为ManagerUsersView
,而不是。ManagerUsers
注意
related_name=…
参数[Django-doc]是反向中关系的名称,所以从User
模型到ScientificInfo
模型。因此,将其命名为……(通常)没有多大意义和前向关系一样。因此,您可能需要考虑将关系重命名为interviewer
interviews
。