
在 Django 的 get_or_create() 等返回元组的方法中,_ 是 Python 中约定俗成的“丢弃变量”,用于接收无需使用的元组元素,从而简洁解包出真正需要的对象(如 user),避免后续需用 user[0].name 这类冗余索引访问。
在 django 的 `get_or_create()` 等返回元组的方法中,`_` 是 python 中约定俗成的“丢弃变量”,用于接收无需使用的元组元素,从而简洁解包出真正需要的对象(如 `user`),避免后续需用 `user[0].name` 这类冗余索引访问。
User.objects.get_or_create() 是 Django ORM 中一个常用方法,它的返回值是一个二元元组:(object, created),其中:
- object 是被检索到或新创建的模型实例(例如 User 对象);
- created 是一个布尔值,表示该对象是新创建的(True)还是已存在并被检索出来的(False)。
因此,当你这样写:
user, _ = User.objects.get_or_create(
name=serializer.data['name'],
email=serializer.data['email'],
password=make_password(serializer.data['password'])
)
你实际上是在进行元组解包(tuple unpacking):将返回的 (user_instance, created_flag) 分别赋值给 user 和 _。此时 user 就是 User 模型实例,可直接调用其字段和方法,例如:
print(user.name) # ✅ 正确:访问模型字段 print(user.email) # ✅ 正确
而如果你省略 , _,写成:
user = User.objects.get_or_create(...) # user 现在是一个 tuple!
那么 user 就是整个元组 (User object, True/False),此时 user.name 会抛出 AttributeError —— 因为元组没有 .name 属性。你必须显式通过索引访问:
user_obj = user[0] # 获取第一个元素(User 实例) print(user_obj.name) # ✅ 正确 created_flag = user[1] # 获取第二个元素(布尔值)
这不仅可读性差,还容易出错。使用 _ 作为占位符,既符合 Python 社区惯例(PEP 8 鼓励将不使用的变量命名为 _),又清晰表达了“我们只关心第一个返回值”的意图。
⚠️ 注意事项:
- _ 并非关键字,而是普通变量名;但它是 Python 解释器和 IDE(如 PyCharm、VS Code)广泛认可的“忽略变量”约定;
- 若需后续逻辑判断是否新建了用户,应显式命名(如 user, created = ...),而非丢弃;
- 多重解包时也可用 * 扩展(如 first, *_, last = [1,2,3,4,5]),但对二元元组,_ 已是最简洁规范的做法。
总结:_ 不是语法糖,而是语义明确的解包占位符——它让代码更安全、更清晰、更符合 Pythonic 风格。











