如何获取外键属性值?Django中OrderItem关联Customer邮箱报错
问题解决:NameError: name 'email' is not defined
错误根源
- 代码中
OrderItem.objects.filter(order__customer__email=email)里的email是未定义的变量,Python找不到它,直接抛出NameError。 - 核心逻辑漏洞:你的
OrderItem模型没有和Order建立关联外键,就算定义了email变量,也没法通过order__customer__email的关联查询获取数据。 - 查询逻辑冗余:要获取当前触发信号的
OrderItem对应的客户邮箱,不需要重新去数据库过滤,直接通过实例的关联关系就能拿到。
修正代码
第一步:补全Model的关联关系
先给OrderItem加上关联Order的外键:
# Models class Customer(models.Model): email = models.EmailField(max_length=150) class Order(models.Model): customer = models.ForeignKey(Customer, on_delete=models.CASCADE) class OrderItem(models.Model): object_one = models.CharField(max_length=300) object_two = models.BooleanField(default=False) # 新增外键,关联到Order,on_delete参数根据业务需求调整 order = models.ForeignKey(Order, on_delete=models.CASCADE)
第二步:修正信号处理函数
# View from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save, sender=OrderItem) def order_item_pre_save(instance, *args, **kwargs): if instance.object_one is not None and instance.object_two: try: # 直接通过实例的关联链获取客户邮箱 customer_email = instance.order.customer.email print(customer_email) except (Order.DoesNotExist, Customer.DoesNotExist): # 处理关联对象不存在的异常情况 print("当前订单项未关联订单,或订单未关联客户") print(instance.object_one) else: print("object_one not provided")
关键修正说明
- 新增
OrderItem.order外键是核心前提,没有这个关联,无法从订单项追溯到客户。 - 用
instance.order.customer.email直接获取关联数据,避免不必要的数据库查询,逻辑更直接。 - 添加
try-except块,防止订单项未关联订单、或订单未关联客户时出现报错。 - 简化
instance.object_two==True为instance.object_two,符合Python布尔值的写法习惯。
内容的提问来源于stack exchange,提问作者betty_
相关产品推荐
相关产品推荐

