【问题标题】:How to chain queries in django view如何在 Django 视图中链接查询
【发布时间】:2020-04-18 04:27:03
【问题描述】:

您好,我正在尝试解决一个特定问题。我正在制作一个基于 3 个模型、任务模型、扩展用户模型(配置文件)和 django 默认用户模型的任务系统。我希望通过 sales_extras 字段显示被分配任务的人员的用户名,该字段是 User 模型的扩展模型。

这是我的模型

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_taskboard 视图的结果是什么?
  • 对不起,谢谢你提醒我,我在帖子里漏掉了。我希望显示被分配任务的人的用户名。这就是为什么我将 sales_extras 放置为 manytomany 字段,以便我可以将查询链接到我的用户模型以获取用户名

标签: python django django-models django-views django-queryset


【解决方案1】:

每个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')
}

【讨论】:

  • 非常感谢。这解决了问题,让我对 django 中的查询有了更好的理解!
猜你喜欢
  • 2018-08-13
  • 2021-07-06
  • 2016-03-20
  • 1970-01-01
  • 2020-05-09
  • 2015-12-17
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多