Django不支持负索引错误:图片上传展示功能异常排查
解决Django QuerySet无法获取最后一条数据的问题
问题原因
你在home视图中通过images[len(images)-1]尝试获取最后一条图片数据时出错,是因为Django的QuerySet不支持负索引(包括这种间接的负索引写法),同时len(images)会触发全表查询,把所有数据加载到内存,效率极低。
解决方案
方法1:使用last()方法(推荐)
直接调用QuerySet的last()方法获取最后一条数据,该方法会自动根据模型的主键倒序查找,无需手动排序:
def home(request): print('here you go ') # 获取最后一条图片记录 last_image = image_classification.objects.last() # 处理无图片的边界情况,避免报错 image_url = last_image.pic.url if last_image else '' return render(request,'home.html',{'print':'everything is ok','image':image_url})
方法2:倒序后取第一条
通过order_by('-id')将数据按主键倒序排列,再用first()取第一条,效果等同于最后一条数据:
def home(request): print('here you go ') # 按主键倒序,取第一条(即最后插入的记录) last_image = image_classification.objects.order_by('-id').first() image_url = last_image.pic.url if last_image else '' return render(request,'home.html',{'print':'everything is ok','image':image_url})
额外优化建议
- 模型类名规范:遵循PEP8命名规范,将
image_classification改为ImageClassification(驼峰命名,首字母大写) - 上传视图健壮性:
uploadImage视图需判断请求方法,同时用get()获取文件,避免键不存在报错:
def uploadImage(request): if request.method == 'POST': print('image handling ') # 用get避免直接取键导致KeyError img = request.FILES.get('image') if img: image = image_classification(pic=img) image.save() return HttpResponseRedirect('/')
内容的提问来源于stack exchange,提问作者Prasanjeet Panda
相关产品推荐
相关产品推荐

