You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取外键属性值?Django中OrderItem关联Customer邮箱报错

问题解决:NameError: name 'email' is not defined

错误根源

  1. 代码中OrderItem.objects.filter(order__customer__email=email)里的email是未定义的变量,Python找不到它,直接抛出NameError。
  2. 核心逻辑漏洞:你的OrderItem模型没有和Order建立关联外键,就算定义了email变量,也没法通过order__customer__email的关联查询获取数据。
  3. 查询逻辑冗余:要获取当前触发信号的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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:05:51