Django:让查询成为有效的方式 你认为这是正确的/有效的查询方式吗?< /P> 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)

Django:让查询成为有效的方式 你认为这是正确的/有效的查询方式吗?< /P> 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),django,Django,这里执行两个查询:存在和获取。您可以将其合并为一个: 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 如果code是一个唯一的字段,则使用try-更为惯用,除了此处的: # in case

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

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
如果
code
是一个
唯一的
字段,则使用
try
-
更为惯用,除了此处的

# 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\u list(..)
将减少获取(和反序列化)的列数。虽然这通常不是一个巨大的提升,但如果列的数量很大,或者存储在其中的数据很大,这可能会非常重要,因为我们会保存反序列化属性,这些属性在以后的过程中永远不会使用。

来自:

此外,如果某个查询集尚未评估,但 知道它将在某个时刻出现,然后使用一些_queryset.exists() 将做更多的整体工作

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

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

谢谢,这很有帮助!:)谢谢你详细的回答,威廉!
discount_code = Discount.objects.filter(code=discount_code_get).first()
if discount_code:
    print(discount_code)