python - Django 查询数据库

标签 python django

我正在尝试在 django 中实现搜索。

我的观点如下:

    search_term = request.GET['search_term']

    customers = Customer.objects.filter(
        Q(chassis__icontains=search_term) | Q(registration__icontains=search_term) |
        Q(email__icontains=search_term) | Q(firstname__icontains=search_term) |
        Q(lastname__icontains=search_term))
    calculations_data = []
    if customers:
        for customer in customers:

            try:
                calculation = Calculations.objects.get(customer=customer, user=request.user)
                calculations_data.append({
                    'calculation': calculation,
                    'price': price_incl_vat(calculation.purchase_price),
                    'customer_fullname': '{} {} '.format(customer.firstname, customer.lastname),
                    'car_chassis': customer.chassis,
                    'car_registration': customer.registration,

                })
            except Calculations.DoesNotExist:
                pass

    context = {'search_term': search_term, 'total_result': len(calculations_data), 'calculation_data': calculations_data}
    return render(request, 'master/search.html', context)

我有两个模型:计算客户。在计算内部我有客户作为外键,但它可以为空。因此,每次计算都不需要有客户。

在我的示例中,如果我有搜索词,结果很好,但如果没有搜索词,那么我只能得到有客户的计算结果。

但是我需要的是,如果没有search_term,我想获得所有计算结果。

是否有更好的方法来编写查询?

谢谢。

最佳答案

由于结果取决于 search_term 的可用性,因此为什么不在 search_term 上使用 if-else

search_term = request.GET.get('search_term', None)
if search_term:
    # when search term is not None
    # get relevant calculations
else:
    calculations = Calculations.objects.all()
    # rest of code

search_term 不为 None 时,您可以通过将 Q 对象直接放入 Calculations.objects 中来进一步简化代码。 filter() 本身(而不是获取相关客户,然后查找相关计算)。在 Django 中,您可以查询Q对象中外键的属性。您首先获取客户,然后使用这些结果来查找计算。这将增加对数据库的查询数量。

您可以执行以下操作:

calculations = Calculations.objects.filter(
                   Q(customer__email__icontains=search_term) | 
                   Q(customer__chassis_icontains=search_term)| 
                   Q(....)).select_related('customer')

相关链接:
1.Lookups that span relationships
2.select_related

关于python - Django 查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42388638/

相关文章:

python - 如何在Python中的多个线程和进程之间有效地共享数据?

Python 取消透视具有重复列名的数据框

python - Django Rest Framework 自定义 JWT 认证

python - django.db.utils.OperationalError : (1045:Access denied for user 'root' @'localhost' (using password: NO)

python - 按日期排序 2 个不同的查询集

python - 为什么这个 python 多处理脚本会在一段时间后变慢?

python - 将颜色列表传递给 pandas .p​​lot

python - 在 Django 中实现 "teams"的模型

python - Django hvad - 在模板中使用多语言对象的最佳实践

python - 在 Django 中运行测试时如何发送电子邮件?