首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带图标的Django get_or_create

带图标的Django get_or_create
EN

Stack Overflow用户
提问于 2017-09-08 16:52:19
回答 3查看 910关注 0票数 2

在我的icontains调用中使用get_or_create会得到一个意想不到的结果。

以下列例子为例:

代码语言:javascript
复制
>>>team_name = "Bears"
>>>Team.objects.get(name__icontains=team_name) # returns DoesNotExist as expected
>>>team, created = Team.objects.get_or_create(name__icontains=team_name)
>>>print(created) # Prints True as expected
>>>print(team.name) # Prints an empty string!

为什么这会创建一个空白的团队,而不是“熊”?我在这里使用get_or_create的原因是,如果后续的用户发布类似"BearS"的内容,我希望得到正确的团队,而不是创建一个大写不正确的重复团队。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-08 17:06:32

我认为这里您应该拆分get()create()功能,而不是使用get_or_create(),因为__icontains查找只适用于get()

试着做这样的事情:

代码语言:javascript
复制
>>> team_name = 'Bears'

>>> teams = Team.objects.filter(name__icontains=team_name)
# This will filter the teams with this name

>>> team = teams.first() if teams.exists() else Team.objects.create(name=team_name)
# Now your team is the first element of your previous query (it returns a QuerySet with single element) if it exists
# Otherwise, you create a new Team.
票数 5
EN

Stack Overflow用户

发布于 2017-09-08 17:52:04

除了wencakisa的答案之外,另一个选项是在get_or_create中包含get_or_create参数,因为Django剥离了包含__分隔符的查找。见this question的答案。

守则将是:

代码语言:javascript
复制
Team.objects.get_or_create(
    name__icontains=team_name,
    defaults = {
        "name": team_name
    }
)
票数 4
EN

Stack Overflow用户

发布于 2019-07-04 18:21:38

正确的方法是使用Django的函数get_or_create()。但是,您应该使用“i精确”(),而不是“图标”(),除非您想要精确匹配,在这种情况下,您应该使用“精确”:

代码语言:javascript
复制
Team.objects.get_or_create(
    name__iexact=team_name,
    defaults = {
        "name": team_name
    }
)

在“默认”之外,你应该把你的搜索词。如果对象不存在,则应在“默认值”中写入创建项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46121243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档