python - 有没有更好的方法来获取创建的对象?
问题描述
我有这段代码,我想将这个创建的用户和问题存储在一行中的一个变量中,而不是以这种奇怪的方式进行,这甚至可能吗?:
if UserProfile.objects.filter(discord_id=request.data['author_id']).exists():
profile = UserProfile.objects.get(discord_id=request.data['author_id'])
else:
x = UserProfile.objects.create(discord_id=request.data['author_id'], name=request.data['name'])
profile = UserProfile.objects.get(discord_id=request.data['author_id'])
Question.objects.create(title=request.data['title'], author=profile, points=int(request.data['points']))
question = Question.objects.filter(author=profile, title=request.data['title'])[0]
解决方案
是的,get_or_create
正是为了这个目的。所以使用:
obj, created = MyModel.objects.get_or_create(...)
一种使用给定 kwargs 查找对象的便捷方法(如果您的模型具有所有字段的默认值,则可能为空),如有必要,创建一个。
返回 (object, created) 的元组,其中 object 是检索或创建的对象, created 是指定是否创建新对象的布尔值。
这是为了防止在并行发出请求时创建重复的对象,并作为样板代码的快捷方式。
另请注意,这Model.create
也会返回创建的对象,无需再次查询。
obj = MyModel.create(...)
推荐阅读
- java - Android 无法创建 SQLite 数据库
- cakephp - Cakephp:在找不到链接上显示自定义错误页面
- c++ - 将解析的数据输入结构时遇到问题
- c++ - 是否有用于从点语言字符串制作 png 的 C++ 函数?
- python - 我想计算python中两列的平均值
- python - 如何使用特殊字符创建字符串列表以了解拆分位置
- node.js - GC 预计会占用 32% 的运行时间?
- bash - 自定义 Rofi 菜单不会返回所选值
- node.js - node-glob 找不到存在且与 minimatch 匹配的文件(Windows 10)
- c++ - 实现具有任意数量的派生类型子节点的基类树?