如何在 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')
}