Django Admin批量操作报错:QuerySet对象无customer属性
Django Admin自定义操作报错:'QuerySet' object has no attribute 'customer'
问题背景
我在OrderAdmin类中添加了名为order_shipped的自定义操作,用于向客户发送订单已发货的通知邮件,但运行时出现错误:'QuerySet' object has no attribute 'customer'。报错信息显示obj为<QuerySet [<Order: 19>]>,但我在list_display中添加的order_shipped_btn方法,同样调用obj.customer.email却能正常显示客户邮箱,不清楚两者表现不同的原因,想知道错误根源及修正方案。
报错的自定义操作代码
class OrderAdmin(admin.ModelAdmin): actions = ['order_shipped'] def order_shipped(self, request, obj): customer_email = obj.customer.email if request.method == 'POST': send_mail( 'Order Shipped', 'Your order has been shipped. Please expect it within the next 3-5 days. Thank you for your business.', EMAIL_HOST_USER, [customer_email], fail_silently=False ) return HttpResponseRedirect('/admin/store/order') order_shipped.short_description = 'Send Order Shipped Email'
错误信息
'QuerySet' object has no attribute 'customer'. obj <QuerySet [<Order: 19>]> request <WSGIRequest: POST '/admin/store/order/'> self <OrderAdmin: model=Order site=AdminSite(name='admin')>
正常工作的列表按钮代码
def order_shipped_btn(self, obj): return format_html('<a href="mailto:{}">SEND</a>', obj.customer.email)
错误原因
- Django Admin的批量操作方法(即
actions配置的方法),接收的第二个参数是选中对象的QuerySet集合——哪怕只选中一个订单,它也是QuerySet类型,而非单个Order实例,自然没有customer属性。 - 而
list_display中的方法,每个行对应一个模型实例,接收的obj是单个Order对象,所以直接调用obj.customer.email可以正常运行。
修正方法
需要遍历QuerySet中的每个订单实例,逐个发送邮件:
修正后的代码
class OrderAdmin(admin.ModelAdmin): actions = ['order_shipped'] def order_shipped(self, request, queryset): # 遍历所有选中的订单 for order in queryset: customer_email = order.customer.email send_mail( 'Order Shipped', 'Your order has been shipped. Please expect it within the next 3-5 days. Thank you for your business.', EMAIL_HOST_USER, [customer_email], fail_silently=False ) # 重定向回订单管理页面 return HttpResponseRedirect('/admin/store/order') order_shipped.short_description = 'Send Order Shipped Email'
提示:建议把参数名从obj改为queryset,更符合语义,避免后续混淆。
内容的提问来源于stack exchange,提问作者jag6
相关产品推荐
相关产品推荐

