如何在 django 视图中链接查询



您好,我正在尝试解决一个特定问题。我正在制作一个建立在 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 的新手,上面是我尝试将用户名取出的方法。我觉得应该有一个内置的查询方法,使我能够将我的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')
}

最新更新