首页 > 解决方案 > 有没有更好的方法来获取创建的对象?

问题描述

我有这段代码,我想将这个创建的用户和问题存储在一行中的一个变量中,而不是以这种奇怪的方式进行,这甚至可能吗?:

    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]

标签: pythondjango

解决方案


是的,get_or_create正是为了这个目的。所以使用:

obj, created = MyModel.objects.get_or_create(...)

一种使用给定 kwargs 查找对象的便捷方法(如果您的模型具有所有字段的默认值,则可能为空),如有必要,创建一个。

返回 (object, created) 的元组,其中 object 是检索或创建的对象, created 是指定是否创建新对象的布尔值。

这是为了防止在并行发出请求时创建重复的对象,并作为样板代码的快捷方式。

另请注意,这Model.create也会返回创建的对象,无需再次查询。

obj  = MyModel.create(...)

推荐阅读