如何在 Django 视图中链接查询
How to chain queries in django view
您好,我正在尝试解决一个具体问题。我正在制作一个基于 3 个模型、任务模型、扩展用户模型(配置文件)和 django 默认用户模型的任务系统。我希望通过 sales_extras 字段显示分配任务的人员的用户名,该字段是用户模型的扩展模型。
这是我的模型
class Sales_taskings(models.Model):
sales_status= (
('p1','Phase 1'),
('p2','Phase 2'),
('p3','Phase 3'),
('p4','Phase 4'),
)
task_id = models.AutoField(primary_key=True)
sales_extras= models.ManyToManyField('sales.Sales_extras')
sales_project= models.ForeignKey('sales.Sales_project',on_delete=models.CASCADE)
description = models.TextField(max_length=200 , default='your notes' )
date_time = models.DateTimeField(auto_now=True)
status = models.TextField(max_length=10, choices= sales_status ,default='p1')
class Sales_extras(models.Model):
role= (
('sm','sales_manager'),
('s','sales'),
)
user = models.OneToOneField(User,on_delete=models.CASCADE)
user_type = models.TextField(max_length=500, choices= role)
这是我对上下文的看法
@login_required
def sales_taskboard(request):
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
sales_extras_id = Sales_taskings.objects.values('sales_extras').get('username')
print(Sales_taskings.objects.values('sales_extras'))
usernames = User.objects.values('username').filter(id__in = sales_extras_id)
print(usernames)
context = {
'sales_task' : Sales_taskings.objects.all(),
'sales_extras' : Sales_taskings.objects.values('sales_extras'),
'usernames' : usernames
}
return render(request, 'sales/taskboard.html',context)
抱歉,我是 django 的新手,上面是我尝试获取用户名的方法。我觉得应该有一个内置的查询方法,使我能够 link 我的 sales_takings
模型和我的 sales_extras
模型,最后到我的 User
模型。
非常感谢您的帮助!
每个 Sales_taskings
实例都有一个 ManyToManyField
"sales_extras",访问时会给出所有相关 Sales_extras
的查询集。由于每个 Sales_extras
都与 User
有关系,所以这一切都可以在您的模板中使用这些属性来完成
上下文
context = {
'sale_tasks' : Sales_taskings.objects.all()
}
模板
{% for sale in sale_tasks %}
<h4>{{ sale.description }}</h4>
<ul>
{% for extra in sale.sales_extras.all %}
<li>{{ extra.user }}</li>
{% endfor %}
</ul>
{% endfor %}
这将是相当低效的,因为您将对每个销售执行一个查询,对每个额外的销售执行另一个查询。您可以使用 prefetch_related
来减少这个
context = {
'sale_tasks' : Sales_taskings.objects.prefetch_related('sales_extras__user')
}
您好,我正在尝试解决一个具体问题。我正在制作一个基于 3 个模型、任务模型、扩展用户模型(配置文件)和 django 默认用户模型的任务系统。我希望通过 sales_extras 字段显示分配任务的人员的用户名,该字段是用户模型的扩展模型。
这是我的模型
class Sales_taskings(models.Model):
sales_status= (
('p1','Phase 1'),
('p2','Phase 2'),
('p3','Phase 3'),
('p4','Phase 4'),
)
task_id = models.AutoField(primary_key=True)
sales_extras= models.ManyToManyField('sales.Sales_extras')
sales_project= models.ForeignKey('sales.Sales_project',on_delete=models.CASCADE)
description = models.TextField(max_length=200 , default='your notes' )
date_time = models.DateTimeField(auto_now=True)
status = models.TextField(max_length=10, choices= sales_status ,default='p1')
class Sales_extras(models.Model):
role= (
('sm','sales_manager'),
('s','sales'),
)
user = models.OneToOneField(User,on_delete=models.CASCADE)
user_type = models.TextField(max_length=500, choices= role)
这是我对上下文的看法
@login_required
def sales_taskboard(request):
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
sales_extras_id = Sales_taskings.objects.values('sales_extras').get('username')
print(Sales_taskings.objects.values('sales_extras'))
usernames = User.objects.values('username').filter(id__in = sales_extras_id)
print(usernames)
context = {
'sales_task' : Sales_taskings.objects.all(),
'sales_extras' : Sales_taskings.objects.values('sales_extras'),
'usernames' : usernames
}
return render(request, 'sales/taskboard.html',context)
抱歉,我是 django 的新手,上面是我尝试获取用户名的方法。我觉得应该有一个内置的查询方法,使我能够 link 我的 sales_takings
模型和我的 sales_extras
模型,最后到我的 User
模型。
非常感谢您的帮助!
每个 Sales_taskings
实例都有一个 ManyToManyField
"sales_extras",访问时会给出所有相关 Sales_extras
的查询集。由于每个 Sales_extras
都与 User
有关系,所以这一切都可以在您的模板中使用这些属性来完成
上下文
context = {
'sale_tasks' : Sales_taskings.objects.all()
}
模板
{% for sale in sale_tasks %}
<h4>{{ sale.description }}</h4>
<ul>
{% for extra in sale.sales_extras.all %}
<li>{{ extra.user }}</li>
{% endfor %}
</ul>
{% endfor %}
这将是相当低效的,因为您将对每个销售执行一个查询,对每个额外的销售执行另一个查询。您可以使用 prefetch_related
来减少这个
context = {
'sale_tasks' : Sales_taskings.objects.prefetch_related('sales_extras__user')
}