您认为这是进行查询的正确/有效方式吗?
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)
答案 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(..)
将减少获取(反序列化)的列的数量。尽管这通常不会带来很大的提升,但是如果列数很大或其中存储的数据很大,这可能就很有意义,因为这样我们就可以保留反序列化属性,这些属性以后将不再使用。