Django:高效查询

时间:2018-08-24 09:07:43

标签: django

您认为这是进行查询的正确/有效方式吗?

discount_code_get = request.GET.get('discount')
    discount_code = Discount.objects.filter(code=discount_code_get)
    discount_code_exists = discount_code.exists()
    if discount_code_exists:
        print(discount_code.first().value)

2 个答案:

答案 0 :(得分:2)

来自docs

  

此外,如果some_queryset尚未评估,但是您   知道会在某个时候,然后使用some_queryset.exists()   将做更多的整体工作

您可以简单地使用first()来获取所需的对象。由于first如果对象不存在,则返回None,因此可以执行以下操作:

discount_code = Discount.objects.filter(code=discount_code_get).first()
if discount_code:
    print(discount_code)

答案 1 :(得分:1)

您在这里执行两个查询:EXISTS和访存。您可以将其合并为一个:

discount_code_get = request.GET.get('discount')
discount_code= Discount.objects.filter(code=discount_code_get).first()
if discount_code is not None:
    return discount_code.value

这行得通,因为.first()如果找不到这样的数据库行,则会返回None

或更有效(给定value不可为空):

# In case value is non-NULLable

discount_code_get = request.GET.get('discount')
discount_value = Discount.objects.values_list(
    'value', flat=True
).filter(code=discount_code_get).first()
if discount_value is not None:
    return discount_value

如果code是一个unique字段,则在此处使用try-except更为习惯:

# in case code is unique

discount_code_get = request.GET.get('discount')
try:
    discount_value = Discount.objects.values_list(
        'value', flat=True
    ).get(code=discount_code_get)
except Discount.DoesNotExist:
    pass
else:
    print(discount_value)

使用.values_list(..)将减少获取(反序列化)的的数量。尽管这通常不会带来很大的提升,但是如果列数很大或其中存储的数据很大,这可能就很有意义,因为这样我们就可以保留反序列化属性,这些属性以后将不再使用。