Django查询数据库

2024-06-25 05:55:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在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)

我有两个模型,calculationscustomer。内部计算我有客户作为外键,但它可以是空的。因此,每个计算不需要有一个客户。你知道吗

在我的例子中,如果我有search term,结果是好的,但是如果没有搜索项,那么我只得到有客户的计算。你知道吗

但我需要的是,如果没有搜索项,我想得到所有的计算结果。你知道吗

有没有更好的方法来编写查询?你知道吗

谢谢。你知道吗


Tags: searchdata客户objectsrequestcustomerregistrationfirstname
2条回答

既然结果取决于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')

相关链接:
1Lookups that span relationships
2^{}

试试这个:

if customers:
        try:
            calculations = Calculations.objects.filter(user=request.user)
            if customers:
                calculations=calculations.filter(customer__in=customers)

            for calculation in calculations:
                 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

相关问题 更多 >